{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "346b99c4a9f878e9aec2a07d3ddc08d1",
     "grade": false,
     "grade_id": "cell-be955a21a9add6d6",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "# Assignment: Dyna-Q and Dyna-Q+"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "ee25bdba2a442f7c9bb323036ff7adff",
     "grade": false,
     "grade_id": "cell-6ab578539f713801",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Welcome to this programming assignment! In this notebook, you will:\n",
    "1. implement the Dyna-Q and Dyna-Q+ algorithms. \n",
    "2. compare their performance on an environment which changes to become 'better' than it was before, that is, the task becomes easier. \n",
    "\n",
    "We will give you the environment and infrastructure to run the experiment and visualize the performance. The assignment will be graded automatically by comparing the behavior of your agent to our implementations of the algorithms. The random seed will be set explicitly to avoid different behaviors due to randomness. \n",
    "\n",
    "Please go through the cells in order. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "93057554e87db5c7a4946ae3ba2d5951",
     "grade": false,
     "grade_id": "cell-9da2a3b80d5b1de4",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "## The Shortcut Maze Environment\n",
    "\n",
    "In this maze environment, the goal is to reach the goal state (G) as fast as possible from the starting state (S). There are four actions – up, down, right, left – which take the agent deterministically from a state to the corresponding neighboring states, except when movement is blocked by a wall (denoted by grey) or the edge of the maze, in which case the agent remains where it is. The reward is +1 on reaching the goal state, 0 otherwise. On reaching the goal state G, the agent returns to the start state S to being a new episode. This is a discounted, episodic task with $\\gamma = 0.95$.\n",
    "\n",
    "<img src=\"./images/shortcut_env.png\" alt=\"environment\" width=\"400\"/>\n",
    "\n",
    "Later in the assignment, we will use a variant of this maze in which a 'shortcut' opens up after a certain number of timesteps. We will test if the the Dyna-Q and Dyna-Q+ agents are able to find the newly-opened shorter route to the goal state."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "f3979f4d8454c9e24f16ed133d08f086",
     "grade": false,
     "grade_id": "cell-d789ad9af5d734f5",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "## Packages\n",
    "\n",
    "We import the following libraries that are required for this assignment. Primarily, we shall be using the following libraries:\n",
    "1. numpy: the fundamental package for scientific computing with Python.\n",
    "2. matplotlib: the library for plotting graphs in Python.\n",
    "3. RL-Glue: the library for reinforcement learning experiments.\n",
    "\n",
    "**Please do not import other libraries** — this will break the autograder."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "16cd32791a2feb655dba393a8ec8e10d",
     "grade": false,
     "grade_id": "cell-9b59a5e962944c1a",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import os, jdc, shutil\n",
    "from tqdm import tqdm\n",
    "\n",
    "from rl_glue import RLGlue\n",
    "from agent import BaseAgent\n",
    "from maze_env import ShortcutMazeEnvironment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "2a42e5b7f720fd0165a2b12b4c99f164",
     "grade": false,
     "grade_id": "cell-70ba6356f71f04d6",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "plt.rcParams.update({'font.size': 15})\n",
    "plt.rcParams.update({'figure.figsize': [8,5]})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "d9b325128e6aa23ac37b7af5193ab516",
     "grade": false,
     "grade_id": "cell-337c52496760f99a",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "## Section 1: Dyna-Q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "663ef3e7cbb35c2f7bcc99e48697e20c",
     "grade": false,
     "grade_id": "cell-ae016536341366d9",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Let's start with a quick recap of the tabular Dyna-Q algorithm.\n",
    "\n",
    "<div style=\"width:80%\"><img src=\"./images/DynaQ.png\" alt=\"DynaQ_pseudocode\"></div>\n",
    "\n",
    "Dyna-Q involves four basic steps:\n",
    "1. Action selection: given an observation, select an action to be performed (here, using the $\\epsilon$-greedy method).\n",
    "2. Direct RL: using the observed next state and reward, update the action values (here, using one-step tabular Q-learning).\n",
    "3. Model learning: using the observed next state and reward, update the model (here, updating a table as the environment is assumed to be deterministic).\n",
    "4. Planning: update the action values by generating $n$ simulated experiences using certain starting states and actions (here, using the random-sample one-step tabular Q-planning method). This is also known as the 'Indirect RL' step. The process of choosing the state and action to simulate an experience with is known as 'search control'.\n",
    "\n",
    "Steps 1 and 2 are parts of the [tabular Q-learning algorithm](http://www.incompleteideas.net/book/RLbook2018.pdf#page=153) and are denoted by line numbers (a)–(d) in the pseudocode above. Step 3 is performed in line (e), and Step 4 in the block of lines (f).\n",
    "\n",
    "We highly recommend revising the Dyna videos in the course and the material in the RL textbook (in particular, [Section 8.2](http://www.incompleteideas.net/book/RLbook2018.pdf#page=183))."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "354d65ba93c059d3100345383340a535",
     "grade": false,
     "grade_id": "cell-31575fcfa515756a",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Alright, let's begin coding.\n",
    "\n",
    "As you already know by now, you will develop an agent which interacts with the given environment via RL-Glue. More specifically, you will implement the usual methods `agent_start`, `agent_step`, and `agent_end` in your `DynaQAgent` class, along with a couple of helper methods specific to Dyna-Q, namely `update_model` and `planning_step`. We will provide detailed comments in each method describing what your code should do. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "3aae482d1f386d62c362697ec771bf43",
     "grade": false,
     "grade_id": "cell-85f53bb3ebb9f77d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Let's break this down in pieces and do it one-by-one.\n",
    "\n",
    "First of all, check out the `agent_init` method below. As in earlier assignments, some of the attributes are initialized with the data passed inside `agent_info`. In particular, pay attention to the attributes which are new to `DynaQAgent`, since you shall be using them later. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "cb3caf80070a7cce0f65a119522d2dbd",
     "grade": false,
     "grade_id": "cell-eda7a35e5ff3252f",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "class DynaQAgent(BaseAgent):\n",
    "\n",
    "    def agent_init(self, agent_info):\n",
    "        \"\"\"Setup for the agent called when the experiment first starts.\n",
    "\n",
    "        Args:\n",
    "            agent_init_info (dict), the parameters used to initialize the agent. The dictionary contains:\n",
    "            {\n",
    "                num_states (int): The number of states,\n",
    "                num_actions (int): The number of actions,\n",
    "                epsilon (float): The parameter for epsilon-greedy exploration,\n",
    "                step_size (float): The step-size,\n",
    "                discount (float): The discount factor,\n",
    "                planning_steps (int): The number of planning steps per environmental interaction\n",
    "\n",
    "                random_seed (int): the seed for the RNG used in epsilon-greedy\n",
    "                planning_random_seed (int): the seed for the RNG used in the planner\n",
    "            }\n",
    "        \"\"\"\n",
    "\n",
    "        # First, we get the relevant information from agent_info \n",
    "        # NOTE: we use np.random.RandomState(seed) to set the two different RNGs\n",
    "        # for the planner and the rest of the code\n",
    "        try:\n",
    "            self.num_states = agent_info[\"num_states\"]\n",
    "            self.num_actions = agent_info[\"num_actions\"]\n",
    "        except:\n",
    "            print(\"You need to pass both 'num_states' and 'num_actions' \\\n",
    "                   in agent_info to initialize the action-value table\")\n",
    "        self.gamma = agent_info.get(\"discount\", 0.95)\n",
    "        self.step_size = agent_info.get(\"step_size\", 0.1)\n",
    "        self.epsilon = agent_info.get(\"epsilon\", 0.1)\n",
    "        self.planning_steps = agent_info.get(\"planning_steps\", 10)\n",
    "\n",
    "        self.rand_generator = np.random.RandomState(agent_info.get('random_seed', 42))\n",
    "        self.planning_rand_generator = np.random.RandomState(agent_info.get('planning_random_seed', 42))\n",
    "\n",
    "        # Next, we initialize the attributes required by the agent, e.g., q_values, model, etc.\n",
    "        # A simple way to implement the model is to have a dictionary of dictionaries, \n",
    "        #        mapping each state to a dictionary which maps actions to (reward, next state) tuples.\n",
    "        self.q_values = np.zeros((self.num_states, self.num_actions))\n",
    "        self.actions = list(range(self.num_actions))\n",
    "        self.past_action = -1\n",
    "        self.past_state = -1\n",
    "        self.model = {} # model is a dictionary of dictionaries, which maps states to actions to \n",
    "                        # (reward, next_state) tuples"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "c8f49f199eb2c0bf11cba86f0b5d3c6e",
     "grade": false,
     "grade_id": "cell-02a81d97cf066622",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Now let's create the `update_model` method, which performs the 'Model Update' step in the pseudocode. It takes a `(s, a, s', r)` tuple and stores the next state and reward corresponding to a state-action pair.\n",
    "\n",
    "Remember, because the environment is deterministic, an easy way to implement the model is to have a dictionary of encountered states, each mapping to a dictionary of actions taken in those states, which in turn maps to a tuple of next state and reward. In this way, the model can be easily accessed by `model[s][a]`, which would return the `(s', r)` tuple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "0623843f71cad67461cc0b5dd7b1751c",
     "grade": false,
     "grade_id": "cell-ca7cf60690bd1e62",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQAgent\n",
    "\n",
    "# [GRADED]\n",
    "\n",
    "def update_model(self, past_state, past_action, state, reward):\n",
    "    \"\"\"updates the model \n",
    "    \n",
    "    Args:\n",
    "        past_state       (int): s\n",
    "        past_action      (int): a\n",
    "        state            (int): s'\n",
    "        reward           (int): r\n",
    "    Returns:\n",
    "        Nothing\n",
    "    \"\"\"\n",
    "    # Update the model with the (s,a,s',r) tuple (1~4 lines)\n",
    "    \n",
    "    ### START CODE HERE ###\n",
    "    if past_state not in self.model:\n",
    "        self.model.update({past_state:{past_action:(state, reward)}})\n",
    "        \n",
    "    else:\n",
    "        self.model[past_state].update({past_action:(state, reward)})\n",
    "\n",
    "        \n",
    "\n",
    "#     self.model[past_state][past_action] = (state, reward)\n",
    "    \n",
    "    \n",
    "    \n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "a67870254bf6049b72911dcbe495ad84",
     "grade": false,
     "grade_id": "cell-feda394cc8d0d0f0",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `update_model()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "4f4aeb91268cae5d6169083963dd4460",
     "grade": true,
     "grade_id": "DynaQ_update_model",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \n",
      " {0: {2: (0, 1), 3: (1, 2)}, 2: {0: (1, 1)}}\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for update_model() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "test_agent.update_model(0,2,0,1)\n",
    "test_agent.update_model(2,0,1,1)\n",
    "test_agent.update_model(0,3,1,2)\n",
    "print(\"Model: \\n\", test_agent.model)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "58a644632b6aea7d2850370ab1066b9e",
     "grade": false,
     "grade_id": "cell-47eee79fcc885cb6",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Model: \n",
    " {0: {2: (0, 1), 3: (1, 2)}, 2: {0: (1, 1)}}\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b49de532a3a274adce7ebf6169961296",
     "grade": false,
     "grade_id": "cell-21e26a912d8b58f2",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Next, you will implement the planning step, the crux of the Dyna-Q algorithm. You shall be calling this `planning_step` method at every timestep of every trajectory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "cffbe7372919f7569a283aad349cc76c",
     "grade": false,
     "grade_id": "cell-299f48859b38c670",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQAgent\n",
    "\n",
    "# [GRADED]\n",
    "\n",
    "def planning_step(self):\n",
    "    \"\"\"performs planning, i.e. indirect RL.\n",
    "\n",
    "    Args:\n",
    "        None\n",
    "    Returns:\n",
    "        Nothing\n",
    "    \"\"\"\n",
    "    \n",
    "    # The indirect RL step:\n",
    "    # - Choose a state and action from the set of experiences that are stored in the model. (~2 lines)\n",
    "    # - Query the model with this state-action pair for the predicted next state and reward.(~1 line)\n",
    "    # - Update the action values with this simulated experience.                            (2~4 lines)\n",
    "    # - Repeat for the required number of planning steps.\n",
    "    #\n",
    "    # Note that the update equation is different for terminal and non-terminal transitions. \n",
    "    # To differentiate between a terminal and a non-terminal next state, assume that the model stores\n",
    "    # the terminal state as a dummy state like -1\n",
    "    #\n",
    "    # Important: remember you have a random number generator 'planning_rand_generator' as \n",
    "    #     a part of the class which you need to use as self.planning_rand_generator.choice()\n",
    "    #     For the sake of reproducibility and grading, *do not* use anything else like \n",
    "    #     np.random.choice() for performing search control.\n",
    "\n",
    "    ### START CODE HERE ###\n",
    "    for i in range(self.planning_steps):\n",
    "        \n",
    "        s = self.planning_rand_generator.choice(list(self.model.keys())) \n",
    "        a = self.planning_rand_generator.choice(list(self.model[s].keys()))\n",
    "\n",
    "        s_new, r = self.model[s][a]\n",
    "\n",
    "        if s_new != -1:\n",
    "            target = r + self.gamma*np.max(self.q_values[s_new])\n",
    "        else:\n",
    "            target = r\n",
    "\n",
    "        self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "        \n",
    "        \n",
    "    \n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "022cff5daeb2a0885bec5f66231b0233",
     "grade": false,
     "grade_id": "cell-deb5f5adef22b4e0",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `planning_step()` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "e7b50b6709c1796e9649880aa88b4fcc",
     "grade": true,
     "grade_id": "DynaQ_planning_step",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \n",
      " {0: {2: (1, 1), 3: (0, 1), 1: (-1, 1)}, 2: {0: (1, 1)}}\n",
      "Action-value estimates: \n",
      " [[0.  0.1 0.  0.2]\n",
      " [0.  0.  0.  0. ]\n",
      " [0.1 0.  0.  0. ]]\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for planning_step() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"planning_steps\": 4,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 5}\n",
    "test_agent = DynaQAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "test_agent.update_model(0,2,1,1)\n",
    "test_agent.update_model(2,0,1,1)\n",
    "test_agent.update_model(0,3,0,1)\n",
    "test_agent.update_model(0,1,-1,1)\n",
    "test_agent.planning_step()\n",
    "print(\"Model: \\n\", test_agent.model)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "cafc07b98a92e3fd29e912aca8a1d2d3",
     "grade": false,
     "grade_id": "cell-2b479d946144873d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Model: \n",
    " {0: {2: (1, 1), 3: (0, 1), 1: (-1, 1)}, 2: {0: (1, 1)}}\n",
    "Action-value estimates: \n",
    " [[0.   0.1   0.   0.2 ]\n",
    " [0.   0.   0.   0.  ]\n",
    " [0.1 0.   0.   0.  ]]\n",
    "```\n",
    "\n",
    "If your output does not match the above, one of the first things to check is to make sure that you haven't changed the `planning_random_seed` in the test cell. Additionally, make sure you have handled terminal updates correctly."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "143ef17b6c34ca12c1528346ad7af4d0",
     "grade": false,
     "grade_id": "cell-19299355538e166b",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Now before you move on to implement the rest of the agent methods, here are the helper functions that you've used in the previous assessments for choosing an action using an $\\epsilon$-greedy policy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "1ab2ef4f11b78d87270f396028252b74",
     "grade": false,
     "grade_id": "cell-9fc1453e5bc78ee0",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQAgent\n",
    "\n",
    "# Do not modify this cell!\n",
    "\n",
    "def argmax(self, q_values):\n",
    "    \"\"\"argmax with random tie-breaking\n",
    "    Args:\n",
    "        q_values (Numpy array): the array of action values\n",
    "    Returns:\n",
    "        action (int): an action with the highest value\n",
    "    \"\"\"\n",
    "    top = float(\"-inf\")\n",
    "    ties = []\n",
    "\n",
    "    for i in range(len(q_values)):\n",
    "        if q_values[i] > top:\n",
    "            top = q_values[i]\n",
    "            ties = []\n",
    "\n",
    "        if q_values[i] == top:\n",
    "            ties.append(i)\n",
    "\n",
    "    return self.rand_generator.choice(ties)\n",
    "\n",
    "def choose_action_egreedy(self, state):\n",
    "    \"\"\"returns an action using an epsilon-greedy policy w.r.t. the current action-value function.\n",
    "\n",
    "    Important: assume you have a random number generator 'rand_generator' as a part of the class\n",
    "                which you can use as self.rand_generator.choice() or self.rand_generator.rand()\n",
    "\n",
    "    Args:\n",
    "        state (List): coordinates of the agent (two elements)\n",
    "    Returns:\n",
    "        The action taken w.r.t. the aforementioned epsilon-greedy policy\n",
    "    \"\"\"\n",
    "\n",
    "    if self.rand_generator.rand() < self.epsilon:\n",
    "        action = self.rand_generator.choice(self.actions)\n",
    "    else:\n",
    "        values = self.q_values[state]\n",
    "        action = self.argmax(values)\n",
    "\n",
    "    return action"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "f836d363c2f53ad316e4d3be6958e543",
     "grade": false,
     "grade_id": "cell-49b0839e77c116f3",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Next, you will implement the rest of the agent-related methods, namely `agent_start`, `agent_step`, and `agent_end`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "3d5e4eadfae22a3707932558a68f90f2",
     "grade": false,
     "grade_id": "cell-d7cd67287d3a4d59",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQAgent\n",
    "\n",
    "# [GRADED]\n",
    "\n",
    "def agent_start(self, state):\n",
    "    \"\"\"The first method called when the experiment starts, \n",
    "    called after the environment starts.\n",
    "    Args:\n",
    "        state (Numpy array): the state from the\n",
    "            environment's env_start function.\n",
    "    Returns:\n",
    "        (int) the first action the agent takes.\n",
    "    \"\"\"\n",
    "    \n",
    "    # given the state, select the action using self.choose_action_egreedy()), \n",
    "    # and save current state and action (~2 lines)\n",
    "    ### self.past_state = ?\n",
    "    ### self.past_action = ?\n",
    "\n",
    "    ### START CODE HERE ###\n",
    "    self.past_action = self.choose_action_egreedy(state)\n",
    "    self.past_state = state\n",
    "    \n",
    "    ### END CODE HERE ###\n",
    "    \n",
    "    return self.past_action\n",
    "\n",
    "def agent_step(self, reward, state):\n",
    "    \"\"\"A step taken by the agent.\n",
    "\n",
    "    Args:\n",
    "        reward (float): the reward received for taking the last action taken\n",
    "        state (Numpy array): the state from the\n",
    "            environment's step based on where the agent ended up after the\n",
    "            last step\n",
    "    Returns:\n",
    "        (int) The action the agent takes given this state.\n",
    "    \"\"\"\n",
    "    \n",
    "    # - Direct-RL step (~1-3 lines)\n",
    "    # - Model Update step (~1 line)\n",
    "    # - `planning_step` (~1 line)\n",
    "    # - Action Selection step (~1 line)\n",
    "    # Save the current state and action before returning the action to be performed. (~2 lines)\n",
    "\n",
    "    ### START CODE HERE ###\n",
    "    s,a = self.past_state, self.past_action\n",
    "    target = reward + self.gamma*np.max(self.q_values[state])\n",
    "    self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "    \n",
    "    self.update_model(s,a, state, reward)\n",
    "    self.planning_step()\n",
    "    \n",
    "    action = self.choose_action_egreedy(state)\n",
    "    self.past_state = state\n",
    "    self.past_action = action\n",
    "    \n",
    "    ### END CODE HERE ###\n",
    "    \n",
    "    return self.past_action\n",
    "\n",
    "def agent_end(self, reward):\n",
    "    \"\"\"Called when the agent terminates.\n",
    "\n",
    "    Args:\n",
    "        reward (float): the reward the agent received for entering the\n",
    "            terminal state.\n",
    "    \"\"\"\n",
    "    \n",
    "    # - Direct RL update with this final transition (1~2 lines)\n",
    "    # - Model Update step with this final transition (~1 line)\n",
    "    # - One final `planning_step` (~1 line)\n",
    "    #\n",
    "    # Note: the final transition needs to be handled carefully. Since there is no next state, \n",
    "    #       you will have to pass a dummy state (like -1), which you will be using in the planning_step() to \n",
    "    #       differentiate between updates with usual terminal and non-terminal transitions.\n",
    "\n",
    "    ### START CODE HERE ###\n",
    "    s,a = self.past_state, self.past_action\n",
    "    target = reward\n",
    "    self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "    \n",
    "    self.update_model(s,a, -1, reward)\n",
    "    self.planning_step()\n",
    "    \n",
    "    \n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "14b7a6eacec0a3564a156c15ed4cc96c",
     "grade": false,
     "grade_id": "cell-cb04070be7e98178",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_start()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "241515d8eb09b5d0ca96c1c60a24af07",
     "grade": true,
     "grade_id": "DynaQ_agent_start",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Action: 1\n",
      "Model: \n",
      " {}\n",
      "Action-value estimates: \n",
      " [[0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_start() ##\n",
    "\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "action = test_agent.agent_start(0)\n",
    "print(\"Action:\", action)\n",
    "print(\"Model: \\n\", test_agent.model)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "f2c06652b1c989ff3174e42a463173ac",
     "grade": false,
     "grade_id": "cell-bc7046affcf9c2f9",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Action: 1\n",
    "Model: \n",
    " {}\n",
    "Action-value estimates: \n",
    " [[0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]]\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b5b76c8ebc0936d8ca8b929d1721fe44",
     "grade": false,
     "grade_id": "cell-069a254ee4ba6e25",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_step()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "24bf8b0fdf3408e6a36ea968df0c6a36",
     "grade": true,
     "grade_id": "DynaQ__agent_step",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Actions: [1, 3, 1]\n",
      "Model: \n",
      " {0: {1: (2, 1)}, 2: {3: (1, 0)}}\n",
      "Action-value estimates: \n",
      " [[0.     0.3439 0.     0.    ]\n",
      " [0.     0.     0.     0.    ]\n",
      " [0.     0.     0.     0.    ]]\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_step() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"planning_steps\": 2,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "actions.append(test_agent.agent_start(0))\n",
    "actions.append(test_agent.agent_step(1,2))\n",
    "actions.append(test_agent.agent_step(0,1))\n",
    "print(\"Actions:\", actions)\n",
    "print(\"Model: \\n\", test_agent.model)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "a47eae38f5b82056b69ea71037a76465",
     "grade": false,
     "grade_id": "cell-0b8605acd440fc7d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "\n",
    "```\n",
    "Actions: [1, 3, 1]\n",
    "Model: \n",
    " {0: {1: (2, 1)}, 2: {3: (1, 0)}}\n",
    "Action-value estimates: \n",
    " [[0.     0.3439 0.     0.    ]\n",
    " [0.     0.     0.     0.    ]\n",
    " [0.     0.     0.     0.    ]]\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "c1fee78afea91645becfd5b193b4b9ab",
     "grade": false,
     "grade_id": "cell-8d3e06f7f489a49c",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_end()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b8e64a1aa1ab9917e78149b1ab4fc9e8",
     "grade": true,
     "grade_id": "DynaQ_agent_end",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Actions: [1, 3, 1]\n",
      "Model: \n",
      " {0: {1: (2, 1)}, 2: {3: (1, 0)}, 1: {1: (-1, 1)}}\n",
      "Action-value Estimates: \n",
      " [[0.      0.41051 0.      0.     ]\n",
      " [0.      0.1     0.      0.     ]\n",
      " [0.      0.      0.      0.01   ]]\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_end() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"planning_steps\": 2,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "actions.append(test_agent.agent_start(0))\n",
    "actions.append(test_agent.agent_step(1,2))\n",
    "actions.append(test_agent.agent_step(0,1))\n",
    "test_agent.agent_end(1)\n",
    "print(\"Actions:\", actions)\n",
    "print(\"Model: \\n\", test_agent.model)\n",
    "print(\"Action-value Estimates: \\n\", test_agent.q_values)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "43711ecd45a75f4ee1f31ac3f5127477",
     "grade": false,
     "grade_id": "cell-25bdfd8dc303b1e7",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "\n",
    "```\n",
    "Actions: [1, 3, 1]\n",
    "Model: \n",
    " {0: {1: (2, 1)}, 2: {3: (1, 0)}, 1: {1: (-1, 1)}}\n",
    "Action-value Estimates: \n",
    " [[0.      0.41051 0.      0.     ]\n",
    " [0.      0.1     0.      0.     ]\n",
    " [0.      0.      0.      0.01   ]]\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "12f59fa0e03a4b5df596a73e3dae0c02",
     "grade": false,
     "grade_id": "cell-329423dc3230312d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Experiment: Dyna-Q agent in the maze environment\n",
    "\n",
    "Alright. Now we have all the components of the `DynaQAgent` ready. Let's try it out on the maze environment! \n",
    "\n",
    "The next cell runs an experiment on this maze environment to test your implementation. The initial action values are $0$, the step-size parameter is $0.125$. and the exploration parameter is $\\epsilon=0.1$. After the experiment, the sum of rewards in each episode should match the correct result.\n",
    "\n",
    "We will try planning steps of $0,5,50$ and compare their performance in terms of the average number of steps taken to reach the goal state in the aforementioned maze environment. For scientific rigor, we will run each experiment $30$ times. In each experiment, we set the initial random-number-generator (RNG) seeds for a fair comparison across algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "a2573b31bd8cce3a89beba2ec09ab2c3",
     "grade": false,
     "grade_id": "cell-28355ff7447c705f",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "def run_experiment(env, agent, env_parameters, agent_parameters, exp_parameters):\n",
    "\n",
    "    # Experiment settings\n",
    "    num_runs = exp_parameters['num_runs']\n",
    "    num_episodes = exp_parameters['num_episodes']\n",
    "    planning_steps_all = agent_parameters['planning_steps']\n",
    "\n",
    "    env_info = env_parameters                     \n",
    "    agent_info = {\"num_states\" : agent_parameters[\"num_states\"],  # We pass the agent the information it needs. \n",
    "                  \"num_actions\" : agent_parameters[\"num_actions\"],\n",
    "                  \"epsilon\": agent_parameters[\"epsilon\"], \n",
    "                  \"discount\": env_parameters[\"discount\"],\n",
    "                  \"step_size\" : agent_parameters[\"step_size\"]}\n",
    "\n",
    "    all_averages = np.zeros((len(planning_steps_all), num_runs, num_episodes)) # for collecting metrics \n",
    "    log_data = {'planning_steps_all' : planning_steps_all}                     # that shall be plotted later\n",
    "\n",
    "    for idx, planning_steps in enumerate(planning_steps_all):\n",
    "\n",
    "        print('Planning steps : ', planning_steps)\n",
    "        os.system('sleep 0.5')                    # to prevent tqdm printing out-of-order before the above print()\n",
    "        agent_info[\"planning_steps\"] = planning_steps  \n",
    "\n",
    "        for i in tqdm(range(num_runs)):\n",
    "\n",
    "            agent_info['random_seed'] = i\n",
    "            agent_info['planning_random_seed'] = i\n",
    "\n",
    "            rl_glue = RLGlue(env, agent)          # Creates a new RLGlue experiment with the env and agent we chose above\n",
    "            rl_glue.rl_init(agent_info, env_info) # We pass RLGlue what it needs to initialize the agent and environment\n",
    "\n",
    "            for j in range(num_episodes):\n",
    "\n",
    "                rl_glue.rl_start()                # We start an episode. Here we aren't using rl_glue.rl_episode()\n",
    "                                                  # like the other assessments because we'll be requiring some \n",
    "                is_terminal = False               # data from within the episodes in some of the experiments here \n",
    "                num_steps = 0\n",
    "                while not is_terminal:\n",
    "                    reward, _, action, is_terminal = rl_glue.rl_step()  # The environment and agent take a step \n",
    "                    num_steps += 1                                      # and return the reward and action taken.\n",
    "\n",
    "                all_averages[idx][i][j] = num_steps\n",
    "\n",
    "    log_data['all_averages'] = all_averages\n",
    "    np.save(\"results/Dyna-Q_planning_steps\", log_data)\n",
    "    \n",
    "\n",
    "def plot_steps_per_episode(file_path):\n",
    "\n",
    "    data = np.load(file_path).item()\n",
    "    all_averages = data['all_averages']\n",
    "    planning_steps_all = data['planning_steps_all']\n",
    "\n",
    "    for i, planning_steps in enumerate(planning_steps_all):\n",
    "        plt.plot(np.mean(all_averages[i], axis=0), label='Planning steps = '+str(planning_steps))\n",
    "\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.xlabel('Episodes')\n",
    "    plt.ylabel('Steps\\nper\\nepisode', rotation=0, labelpad=40)\n",
    "    plt.axhline(y=16, linestyle='--', color='grey', alpha=0.4)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:04<00:00,  6.80it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:05<00:00,  5.66it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  50\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:35<00:00,  1.17s/it]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAFKCAYAAAD/tU6fAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XtclHXa+PHPNTDADCByEBEPKJYintPKs+Yhyx4ra9W2ddN8fpuatbv6WKulqZVbZqnZ4dmsVms7mWVmPnlsXbVyH/PwZGoeSdA8gAqCMqDI9/fHDNMMDAcRGNPr/XrNq+a+r/u+v8ML8OL6nsQYg1JKKaXU1cbi7wYopZRSSlUHTXKUUkopdVXSJEcppZRSVyVNcpRSSil1VdIkRymllFJXJU1ylFJKKXVV0iRHKaWUUlclTXKUUkopdVXSJEcppZRSV6VAfzdAXZ6YmBjTuHFjfzdDKaWUqjFbt249aYypU16cJjm/co0bN2bLli3+boZSSilVY0QktSJx2l2llFJKqauSJjmVJCL/EhFTyquzK0ZE5AkROSwiDhHZICLtfNwrWUS+EpFcETkqIk+LSEDNfyqllFLq6qHdVZX3MFCr2LGngfbAd673E4EpwGPAHmA8sFZEWhljjgOISCSwFtgN3AU0BV7CmYBOrubPoJRSSl21NMmpJGPMbs/3IhIEdAQWGWMKRCQEZ5LznDHmVVfMJuAQ8Ai/JDCjARtwjzEmG1gjIrWAaSLyguuYUkoppS6RdldVnduASOBD1/suOCs9HxcFGGPOAV8At3tcdzuwqlgy8xHOxKdndTZYKaWUupppklN17gN+Bja63icBF4H9xeJ+dJ3DI26PZ4AxJg3ILRanlFJKqUug3VVVQETswEBgvjHGuA5HAmeNMReLhWcCdhEJMsacd8Vl+bhtpuucUuoqkJ2dTXp6OhcuXPB3U5S6YlmtVmJjY6lVq/iQ18rRJKdqDATC+KWrqojxESs+zpUW5+s4IvIQ8BBAo0aNLqmhSqmal52dzYkTJ6hfvz42mw0RKf8ipa4xxhgcDgc///wzQJUkOtpdVTXuAw4YYzxX5csEwn1MBa8N5BpjLnjE1fZxzwh8V3gwxsw3xnQ0xnSsU6fcBR+VUn6Wnp5O/fr1sdvtmuAoVQoRwW63U79+fdLT06vknprkXCYRicA5eLh4FWcPEABcV+x48TE4eyg29kZEGgKhxeKq3YG0nbzw4UPs3P9tTT5WqavehQsXsNls/m6GUr8KNputyrp1Ncm5fIOAYEomOd8C2cDgogMeY3dWeMStAPqLSLjHsaGAA1hfHQ0uTcrRH/jH+U18vXNF+cFKqUuiFRylKqYqf1Y0ybl89wHfG2N+9DxojMkDngeeEJGxItIHWIzza/6KR+jfgHxgiYj0dY23mQbMruk1chLj6gNwPCujJh+rlFJKVQtNci6DiMQAfXCua+PL88AMYBKwHOe6Of2MMSeKAowxma57BOBcQ2c6MAeYWn0t9y08LBaAU2d9DgVSSl3Dpk2bhoi4X/Hx8dx7770cPHjQHTNixAg6duzox1Y6Ny2eMGGCX9vgaf78+SxdutTfzag2b775Jtdffz0hISF06NCBr776yt9N8qKzqy6DMeYkYC3jvMGZ5Mwo5z67gd5V27pLZwt1Jjm5+Tnkni/AHqTfHkqpX0RERLBy5UoAUlJSmDJlCn369GHXrl2Ehob6uXVOn332GdHR0f5uhtv8+fNp1aoVd999t7+bUuU++ugjRo8ezbRp0+jWrRsLFizgP/7jP/juu+9o1aqVv5sHaJKjPNiCncOCxJLHjiNn6JR45fyiUEr5X2BgIJ06dQKgU6dONGrUiO7du/Pll18yePDgcq6uGe3bt/d3E64ZU6dOZfjw4UyZMgWAnj17sn37dp5//nnee+89P7fOSburlJvVYiXQGETOsy0t09/NUUpd4Tp06ADAoUOHfJ4/duwYI0eOJDExEZvNRrNmzZg8eTLnz593xxw6dAgR4eOPP2bUqFFERETQoEEDpk6dSmFhoTtu2rRpxMTEsH37djp16oTdbqd9+/Zs3LjR65nFu6uKutDWrFlDmzZtCA0NpVu3buzatcvruszMTO677z5CQ0OJj49n5syZTJgwgcaNG5f5Ndi1axe33XYbUVFRhIaG0qJFC1577TUAevXqxdatW3nnnXfc3XwLFy50X/vWW2/RsmVLgoODSUhI4IUXXvC6d1Hbly5dSlJSEiEhIXTr1o3du722TuTtt9+mZcuW2Gw2YmJi6NmzZ4nPV9VSUlLYt28fQ4YMcR+zWCwMHjyYFSuunMkrWslRXuwIQdYCtqXquBylVNmKkpu4uDif50+ePElUVBSzZ88mMjKSffv2MW3aNDIyMnjjjTe8Yh9//HHuvfdePvnkE7766iuefvppWrZs6fWPaG5uLsOHD2fcuHHExcUxffp0Bg0aRFpaGna7vdR2pqWl8dhjj/Hkk09is9mYMGECQ4YMYefOne6ZPCNGjODrr7/m5ZdfJi4ujjlz5rBv3z4CAoovdebtzjvvJCkpiffee4/g4GD27t1LdrZzzsjrr7/OvffeS2Jiorva0bRpUwBmzZrFE088weOPP+5OhqZMmYLdbueRRx5x3z81NZXx48fzzDPPYLPZmDp1Kv3792f//v2EhISwYcMGRo8ezdNPP03nzp3Jzs5m06ZNnDlzpsx2FxQUlHkeICAgoNSZTnv2OFc4SUry3n2oRYsWnD59moyMDK6Eddw0yVFebFiwBF5ke1omxhid9qpUNZn+xS52H63RCZRuyfG1mDqwZaWuLfrHMSUlhYcffpjw8HD69u3rM7Z169a8+OKL7vddu3YlNDSUkSNH8sorrxAUFOQ+16NHD1566SUA+vXrx8qVK1myZIlXkuNwOJg7dy69ezuHMNarV4/27duzYcMGbrvttlLbfPr0ab755huuv/56AAoLCxk0aBB79+4lKSmJnTt3smzZMj7++GN3t1ufPn1o2LAhYWFhpd735MmTpKSksHTpUlq3bu2+rkhycjKhoaHUqVPH3c0HzhWwp0+fzuTJk5k6dar7M+fm5vLss88yZswYd3J18uRJPv/8c7p06QI4q2dNmzZl4cKFjB49ms2bN9OmTRsmTZrkvv+dd95ZapvBmZw2adKkzBiAdevW0atXL5/nMjOd1f7atb3Xso2MjHSfvxKSHO2uUl5sEoAJKODUufOknc71d3OUUleQU6dOYbVasVqtNG/enJSUFBYtWkS9evV8xhtjmDt3LsnJydhsNqxWK7/73e/Iz88nLS3NK/bWW2/1ep+cnMyRI0e8jlmtVq9/dJOTkwFKxBXXuHFjd4Lj67otW5yL1Q8cONAdY7PZSk3eikRFRdGwYUNGjx7NokWLKrxK76ZNmzh37hyDBw+moKDA/erduzcnTpzw+jyxsbHuBAcgISGBDh06sHnzZgDatWvH9u3bGTduHBs2bPDqCixNfHw83333Xbmvou7IshT/Q7ho+8Yr5Q9kreQoL3YJpEDyAdiWlklC9JUxY0Kpq01lKyn+FBERwdq1axER4uLiiI+PL/Mfs7lz5zJhwgQmTpxIz549iYyM5LvvvmPs2LHk5eV5xRavCAQFBZWIqVWrFhaLxSsGKBFXnK97e153/PhxwsPDCQkJ8YorrxJhsVhYvXo1Tz75JCNHjsThcNC1a1fmzZtX5gDokydPAtCype/vgcOHD5OQkAA4k5ziYmNjOXbsGAB9+/ZlwYIFzJs3j5dffpmwsDCGDRvGrFmzSp3xFhQURLt27cr8bECZXXVFFZusrCwiIiLcx7OynEMdin/N/UWTHOXFZgkin3OEBQeyNTWTQe0b+LtJSqkrRGBg4CWtg7N48WIGDx7MjBm/rKJRfNDslSAuLo6cnBzy8vK8Ep2MjPIXRk1KSuLTTz/lwoULbNy4kb/85S/ccccdHDlyxCsh8xQVFQXA8uXLqVu3bonzzZs3d/+/r+pQenq6V4I0fPhwhg8fTkZGBkuWLGHcuHHUqlWL559/3ufzq6K7qmgszp49e9wJWdH7qKioK6KrCjTJUcXYAoI5bQpp2zBCBx8rpS6Lw+EgODjY69j777/vp9aUrihxW7ZsmXsMkMPhYM2aNYSHh5d1qZvVaqV3796MHz+e+++/n6ysLKKionxWpDp37ozNZuPo0aPccccdZd43PT2db7/91t1llZaWxrZt23jwwQdLxNapU4dRo0axZMmSMpPJou6q8ngmW8UlJibSrFkzFi9eTP/+/QHnWKfFixdz++23l3vvmqJJjvJiDwzhZwy3NKzFK//6iXP5BYQG67eJUurS9evXj3nz5nHzzTfTtGlT3n//fQ4cOODvZpXQqlUrBg4cyJgxY8jJySEuLo7Zs2djt9tLrcYA7NixgwkTJjB06FASExPJzMxk5syZtG3b1l2tSUpKYtWqVaxatYro6GiaNGlCdHQ006ZN409/+hOpqan06NGDwsJC9u3bx7p16/jss8/cz4iJieH3v/+9e3bVU089RWxsLCNGjACca9WcPn2aXr16uafYr1+/vtQqDji7q6piZepp06YxbNgwGjduTNeuXXnnnXfYv38/H3zwwWXfu6rov17Kiy3QhsMidIy3Umjg+yNZdGka4+9mKaV+hZ566ikyMjKYPHkyAPfccw/z5s3zGuB7pVi4cCFjxozhj3/8I2FhYYwdO5bExMQyKx5xcXHUrVuXGTNmcPToUWrXrs0tt9zCzJkz3TGTJ08mLS2NIUOGkJ2dzYIFCxgxYgSPP/448fHxzJkzh5deeomQkBCaNWvG0KFDvZ6RkJDAE088wcSJE0lNTaVjx458+OGH7m61G2+8kTlz5vDRRx+Rk5NDQkKCO4Gqbr/97W85e/YsM2fO5JlnnqFly5YsX778ilntGECKRkKrX6eOHTuaopkBVWHG8uF8mf4dK27/gjYv7+Gx/s0Ze8t1VXZ/pa5FP/74Iy1atPB3M9QlKCgooFWrVtx888288847fmnDiBEj2LlzJ1X5O/7XoryfGRHZaowptxyllRzlxW4Nw2GxUEtyaVonlG2puvKxUurqt3jxYo4ePUrr1q3Jzs7mzTffZP/+/bz77rv+bpq6DJrkKC+24HAuiHAhN5MbGkXy1Z50XRRQKXXVCw0NZcGCBRw4cICLFy/SunVrvvjiC2666SZ/N01dBk1ylBdbkHMmgcNxkhsSGrN46xEOncqlScyVs17OybP5HD+TR6v6EeUHK6VUBQwYMIABAwb4uxlePPe5UpWjKx4rL/YQ5wJPDsdpbmjk/P+tV1iX1Yur9jL0jU1cuFhYfrBSSqlrliY5yostxLlKpcNxmutjwwgPDrzidiTflpbJufMX+fGYf/b9UUop9eugSY7yYgtxru2Qm5+FxSK0a1T7ihp8fC6/gAPpZwHYcujKaZdSSqkrjyY5yos9xDnOxZF3BoAbGkWy70QOZ/ML/Nkst50/n6HQterBldaNppRS6sqiSY7yYgu0AeA47+wKuiEh0rko4OErY4uHHUecyVfX66LZknoaXedJKaVUaTTJUV5+SXKcXULtGjrH6FwpXVbfH8mifm0b/VvGcSI7n5+zHP5uklJKqSuUJjnKiz3QDkDuhXMARNisXB8bdsUMPt5x5AxtGkTQIeHKnPmllFLqyqFJjvJis7oqORdy3cduaBTJ9sNZFBb6t2so89x50k7n0qZBbZrXDSc0KEAHHytVQ6ZNm4aIuF/x8fHce++9HDx40B0zYsSIKtn48XI0btyYCRMm+LUNnubPn8/SpUv93Yxq0atXL6/viaJX8V3X/UkXA1Reiio5jou/fJPekFCbRVsOk3LyHNfFhvmraez42Tkep22DCAIDLLRvFKmVHKVqUEREBCtXrgQgJSWFKVOm0KdPH3bt2kVo6JWxYOhnn31GdHS0v5vhNn/+fFq1asXdd9/t76ZUi1tuuYW//vWvXseCg4P91JqSNMlRXkICnTvb5nomOa5FAbelZfo3yXENfm7VwDkDrENCJK/8cz9n8wsIC9ZvZaWqW2BgIJ06dQKgU6dONGrUiO7du/Pll18yePBgP7fOqX379v5uwjUlKirK/T1xJdLuqssgIoEiMlFE9otIvogcEZE5xWJERJ4QkcMi4hCRDSLSzse9kkXkKxHJFZGjIvK0iATU3KdxsogFGwE4Lp53H2taJ4xaIYFs9/O4nO+PnCGxTii1QqwAdGzsnPnl73Ypda3q0KEDAIcOHfJ5/tixY4wcOZLExERsNhvNmjVj8uTJnD//y++XQ4cOISJ8/PHHjBo1ioiICBo0aMDUqVMpLPxlVfNp06YRExPD9u3b6dSpE3a7nfbt27Nx40avZxbvrirqQluzZg1t2rQhNDSUbt26sWvXLq/rMjMzue+++wgNDSU+Pp6ZM2cyYcIEGjduXObXYNeuXdx2221ERUURGhpKixYteO211wBnd87WrVt555133F05nls1vPXWW7Rs2ZLg4GASEhJ44YUXvO5d1PalS5eSlJRESEgI3bp1Y/fu3V5xb7/9Ni1btsRmsxETE0PPnj1LfL5rlSY5l2cB8EfgReBWYCJQfLrPRGAKMBMYCJwF1opIXFGAiEQCawED3AU8DfwXML2a2++TzRKIo/ACuH7BWCxC+0aRbEv17zTyHUeyaNugtvt9u4a1sYguCqiUvxQlN3FxcT7Pnzx5kqioKGbPns3KlSt57LHHWLBgAY8++miJ2Mcff5ywsDA++eQThg0bxtNPP80nn3ziFZObm8vw4cMZNWoUn376KcHBwQwaNIjc3NwS9/OUlpbGY489xpNPPsmHH35Ieno6Q4YM8VqCYsSIEaxZs4aXX36Z+fPns3r1ahYtWlTu1+DOO+8kICCA9957j2XLlvHoo4+Sk5MDwOuvv05SUhIDBgxg06ZNbNq0iTvuuAOAWbNmMWbMGO6++26WL1/OmDFjmDJlCq+++qrX/VNTUxk/fjxTpkzhgw8+4MyZM/Tv39897mXDhg2MHj2aYcOGsWLFCv7+97/TpUsXzpw5U2a7CwoKyn1VZImO1atXY7fbsdvt9O/fnx07dpR7TU3SGn8lichtwH1AW2PM7lJiQnAmOc8ZY151HdsEHAIeASa7QkcDNuAeY0w2sEZEagHTROQF17EaY7MEkWsROH8WQmoBzi6ruV/tIzvvgruSUpOOn8kjPSefNg1+2ZQzPMRK87haV8zML6UuyYqJcPwH/zw7rjXc/nylLi0ocC4MmpKSwsMPP0x4eDh9+/b1Gdu6dWtefPFF9/uuXbsSGhrKyJEjeeWVVwgKCnKf69GjBy+99BIA/fr1Y+XKlSxZsoQhQ4a4YxwOB3PnzqV3794A1KtXj/bt27NhwwZuu+22Utt8+vRpvvnmG66//noACgsLGTRoEHv37iUpKYmdO3eybNkyPv74Y3e3W58+fWjYsCFhYaV30Z88eZKUlBSWLl1K69at3dcVSU5OJjQ0lDp16nh16WRnZzN9+nQmT57M1KlT3Z85NzeXZ599ljFjxhAQEOB+xueff06XLl0AZ/WsadOmLFy4kNGjR7N582batGnDpEmT3Pe/8847S20zOJPTJk2alBkDsG7dOnr16lXq+Z49ezJ8+HCuu+46UlNTmTFjBt27d+f7778vtwJWU7SSU3kjgX+WluC4dAFqAR8XHTDGnAO+AG73iLsdWFUsmfkIZ+LTs8paXEG2gGAcIpD/S3NuSKiN8eOigN8fcT63jUclB6BjQiTb07K46OeZX0pdC06dOoXVasVqtdK8eXNSUlJYtGgR9erV8xlvjGHu3LkkJydjs9mwWq387ne/Iz8/n7S0NK/YW2+91et9cnIyR44c8TpmtVq9/tFNTk4GKBFXXOPGjd0Jjq/rtmzZAsDAgQPdMTabrdTkrUhUVBQNGzZk9OjRLFq0iPT09DLji2zatIlz584xePBgr8pJ7969OXHihNfniY2NdSc4AAkJCXTo0IHNmzcD0K5dO7Zv3864cePYsGGDV1dgaeLj4/nuu+/KfRV1R5Zm+vTpPPjgg3Tv3p1hw4axbt06RIS5c+dW6OtQE7SSU3k3A8tE5FXgAZxfy5XAI8aYo66YJOAisL/YtT8CQz3eJwH/9AwwxqSJSK7r3BdV3/zS2QNDnElOXja4CiftGtZGBLalZtH9+jo12RzA2VUVaBFaxtfyOt4hIZJ//DuVPcezaRkfUcrVSl2BKllJ8aeIiAjWrl2LiBAXF0d8fDwiUmr83LlzmTBhAhMnTqRnz55ERkby3XffMXbs2BLTjGvX9v4DJigoqERMrVq1sFgsXjFAuVOWfd3b87rjx48THh5OSEiIV1ydOmX/rrNYLKxevZonn3ySkSNH4nA46Nq1K/PmzStzAPTJkycBaNmypc/zhw8fJiEhAXAmOcXFxsZy7NgxAPr27cuCBQuYN28eL7/8MmFhYQwbNoxZs2aVOuMtKCiIdu1KDA0toaiaVFFxcXF07dqVbdu2XdJ11UmTnMqLA0YA3+PstgoHXgA+E5FOxtmZGQmcNcZcLHZtJmAXkSBjzHlXnK8SSabrnBcReQh4CKBRo0ZV82k82AJt5FosXpWc8BArzWLD/dY1tOPIGZrVDSfE6v1D57kooCY5SlWvwMDAS1oHZ/HixQwePJgZM2a4jxUfNHsliIuLIycnh7y8PK9EJyMjo9xrk5KS+PTTT7lw4QIbN27kL3/5C3fccQdHjhzxSsg8RUU5N0Jevnw5devWLXG+efPm7v/3VR1KT0/3SpCGDx/O8OHDycjIYMmSJYwbN45atWrx/PO+E+mq6q4qTVmJb03TJKfyxPW6yxhzCkBEjgHrgd7AV644X/0o4uNcaXEljhtj5gPzATp27Fjl/TQ2ayhZIpCf43X8hoTaLN9xjMJCg8VSc9/Exhh2HDnDgNYlBzc2iLRRt1YwW1MzeaBz4xprk1KqfA6Ho8SaKe+//76fWlO6osRt2bJl7jFADoeDNWvWEB4eXqF7WK1Wevfuzfjx47n//vvJysoiKirKZ0Wqc+fO2Gw2jh496h6IXJr09HS+/fZbd5dVWloa27Zt48EHHywRW6dOHUaNGsWSJUvKTCaLuqvK45lsVcSJEyf45ptvGDly5CVdV500yam8TCClKMFx+Ro4DyTjTHIygXARCShWzakN5BpjLnjcy7ue6hSB7wpPtbJZw3BYBPK8R+ff0CiSDzcf5mDGWa6vW7Ef/KqQeiqXM44LJcbjgPMvho4JUTrDSqkrUL9+/Zg3bx4333wzTZs25f333+fAgQP+blYJrVq1YuDAgYwZM4acnBzi4uKYPXs2dru91GoMwI4dO5gwYQJDhw4lMTGRzMxMZs6cSdu2bd3VmqSkJFatWsWqVauIjo6mSZMmREdHM23aNP70pz+RmppKjx49KCwsZN++faxbt47PPvvM/YyYmBh+//vf88wzz2Cz2XjqqaeIjY1lxIgRAEydOpXTp0/Tq1cv9xT79evXl1rFAWd31eWuTL1jxw4mTZrE4MGDSUhIIC0tjeeeew6LxcKf//zny7p3VdIkp/J+BHwt6yhA0eIOe4AA4Dpgr0dMkuscHnFJXjcRaQiEFourEfagcHLFu7sKnDuSg3NRwJpMcn4ZdOy7O+qGhEj+54djHD+TR1xEiM8YpVTNe+qpp8jIyGDyZOdE0nvuuYd58+Z5DfC9UixcuJAxY8bwxz/+kbCwMMaOHUtiYmKZFY+4uDjq1q3LjBkzOHr0KLVr1+aWW25h5syZ7pjJkyeTlpbGkCFDyM7OZsGCBYwYMYLHH3+c+Ph45syZw0svvURISAjNmjVj6NChXs9ISEjgiSeeYOLEiaSmptKxY0c+/PBDd7fajTfeyJw5c/joo4/IyckhISHBnUBVp+joaIwxTJo0iVOnThEeHk6vXr1YunRptQyjqDRjjL4q8QImAOeAGI9jvXB2L3VzvQ8BzgCTPWLsQDrwrMexScBpILzY/XOBWmW1o0OHDqaqPb/pWXPz35ON2TjH63hhYaFpO32VeXzx91X+zLI8/cUu0+zJL835gos+z/9fWqZJ+Mtys/z7ozXaLqUqavfu3f5ugrpEFy5cMM2bNzcPPPCA39owfPhwUx2/438NyvuZAbaYCvxbrZWcypuPcyHAL0TkrzgHHs8E1hpjvgYwxuSJyPPAFBHJxFmVGY9z6v4rHvf6m+teS0RkJpAITANmmxpeIwfAFhSOQwSTdwbPkTciQvuGtWt88PGOI1m0jK+FNcB32Tg5vhY2awBbUk9zRxvfU1mVUqosixcv5ujRo7Ru3Zrs7GzefPNN9u/fz7vvvuvvpqnLoElOJRljskWkNzAP55o254HPgXHFQp/HmdRMAqKBLUA/Y8wJj3tlikgf4FWc08WzgDk4E50aZ7faKRThfF5Wif64GxpFsm5vBmccF4iwVf+igAUXC9n5czZDb2xYaow1wELbhhG6WadSqtJCQ0NZsGABBw4c4OLFi7Ru3ZovvviCm266yd9NU5dBk5zLYIw5AAwoJ8YAM1yvsuJ245yV5Xe2QBsAub6SHNe4nP87nEXPZtW/Xs6BjLM4LlykbcOyp4d3SIjkb+tTyD1fgD1Iv62VUpdmwIABDBhQ5q/zGue5z5WqHF3xWJVgD7QD4DhfsqesrWu/qG01VDXZcdg5w8vXzCpPHROiuFho+P5w2fu1KKWUunZokqNKKKrkOIqtkwMQFhxIs7o1tyjg90eyCA8OpEm075U7i9zQqGhRwNM10SyllFK/AprkqBLc3VU+Kjng7Br6v7QsCmtgv6gdR87QukFEuYsPRtitNKsbxhYdl6OUUspFkxxVgt3q6q66cM7n+RsaRZKTX8D+9LPV2o78govsOZ5dbldVkQ4JkWxLzayR5EsppdSVT5McVYK7u6og1+d5z0UBq9OPx3K4cNHQtpRFAIvrkBBFdl4BBzKqN/lSSin166BJjirB3V1VkAemZFWkcbSdqNAg/rEplY82p5F2KrdoAcMqtaNopeOGFavkdHQlX7rFg1JKKdAkR/ngnl2FgQslqzkiwuieiWSczWfikh/oMWsd3Wau47HF3/PZ9iMcP5NX4prK+P7wGWLCgoilmAxQAAAgAElEQVSv4FYNCdF2okOD2KKDj5WqctOmTUNE3K/4+HjuvfdeDh486I4ZMWLEZe+JdLkaN27MhAkT/NoGT/Pnz2fp0qX+bka16NWrl9f3RNGr+IakP//8M4MGDSIsLIyYmBgeeeQRcnN99xRUNV1QRJXg7q6yCORlQ1DJmU0P9WjKH7oncjDjLN8ePMW3B06xevcJFm89AkBinVC6NI2mS9MYOidGExkadMnt2HEkizYNaiNSsR3PRYQOCZG6KKBS1SQiIoKVK1cCkJKSwpQpU+jTpw+7du0iNLTsGZA15bPPPiM6OtrfzXCbP38+rVq14u677/Z3U6rFLbfcwl//+levY547zxcUFNC/f3+CgoJYtGgRWVlZjB8/nqysLN57771qb58mOaoEm9XVXSUWyM8BfG+VICJcFxvOdbHhPNC5MYWFht3Hstl08BTfHjzJZ9t+5r1/pxEWHMiyR7qSWCeswm04m+8cW3Op2zR0bBzJ6t0nyMjJp064r/1TlVKVFRgYSKdOnQDo1KkTjRo1onv37nz55ZcMHjzYz61zat++vb+bcE2Jiopyf0/4snjxYn788UcOHDhAkyZNALBardx3331MnTqV66+/vlrbp91VqoQgSxABWJyVnPyKb51lsQit6kfwhx6JLHjwJv5v6q18PKozxhheWLm3/Bt42PnzGYyBthWcWVWkQ0IUgFZzlKoBHTp0AODQoUM+zx87doyRI0eSmJiIzWajWbNmTJ48mfPnz7tjDh06hIjw8ccfM2rUKCIiImjQoAFTp06lsLDQHTdt2jRiYmLYvn07nTp1wm630759ezZu3Oj1zOLdVUVdaGvWrKFNmzaEhobSrVs3du3a5XVdZmYm9913H6GhocTHxzNz5kwmTJhA48aNy/wa7Nq1i9tuu42oqChCQ0Np0aIFr732GuDsztm6dSvvvPOOuyvHcxXjt956i5YtWxIcHExCQgIvvPCC172L2r506VKSkpIICQmhW7du7N692yvu7bffpmXLlthsNmJiYujZs2eJz+cvK1as4MYbb3QnOAB33303QUFB7qpgddIkR5UgItgCgnGIQF7lVxC2Bli4qUkUo3o2ZeWu45e0UJ970HEFZ1YVaVW/FkGBFl0UUKkaUJTcxMXF+Tx/8uRJoqKimD17NitXruSxxx5jwYIFPProoyViH3/8ccLCwvjkk08YNmwYTz/9NJ988olXTG5uLsOHD2fUqFF8+umnBAcHM2jQoHLHd6SlpfHYY4/x5JNP8uGHH5Kens6QIUO8JkyMGDGCNWvW8PLLLzN//nxWr17NokWLyv0a3HnnnQQEBPDee++xbNkyHn30UXJynAupvv766yQlJTFgwAA2bdrEpk2buOOOOwCYNWsWY8aM4e6772b58uWMGTOGKVOm8Oqrr3rdPzU1lfHjxzNlyhQ++OADzpw5Q//+/d3jXjZs2MDo0aMZNmwYK1as4O9//ztdunThzJmyf3cXFBSU+6rIhJLVq1djt9ux2+3079+fHTt2eJ3fs2cPSUlJXseCgoJo2rQpe/bsKff+l0u7q5RPtsAQHBbLJVVySvP/ujfhvX+nMuN/fuTTMV0qNMbm+yNnqF/bRnTYpXU5BQcG0Ka+btaprnwzN89kz+nq/yXvS1JUEn+56S+VuragoABwjsl5+OGHCQ8Pp2/fvj5jW7duzYsvvuh+37VrV0JDQxk5ciSvvPIKQUG/jNXr0aMHL730EgD9+vVj5cqVLFmyhCFDhrhjHA4Hc+fOpXdv5zZ/9erVo3379mzYsIHbbrut1DafPn2ab775xt01UlhYyKBBg9i7dy9JSUns3LmTZcuW8fHHH7u73fr06UPDhg0JCyu9m/3kyZOkpKSwdOlSWrdu7b6uSHJyMqGhodSpU8erSyc7O5vp06czefJkpk6d6v7Mubm5PPvss4wZM4aAgAD3Mz7//HO6dOkCOKtnTZs2ZeHChYwePZrNmzfTpk0bJk2a5L7/nXfeWWqbwZmcelZWSrNu3Tp69epV6vmePXsyfPhwrrvuOlJTU5kxYwbdu3fn+++/d1fAMjMzqV27ZEU+MjKSzMzq/z2tlRzlkz3QTq64Bh5f7r2CAhnfrxnb0rJYufN4ha7ZcSSr3E05S9OhcSQ7f84m78LFSl2vlPLt1KlTWK1WrFYrzZs3JyUlhUWLFlGvnu+xc8YY5s6dS3JyMjabDavVyu9+9zvy8/NJS0vzir311lu93icnJ3PkyBGvY1ar1esf3eTkZIASccU1btzYa+xH8eu2bNkCwMCBA90xNput1OStSFRUFA0bNmT06NEsWrSI9PT0MuOLbNq0iXPnzjF48GCvyknv3r05ceKE1+eJjY11JzgACQkJdOjQgc2bNwPQrl07tm/fzrhx49iwYYNXV2Bp4uPj+e6778p9FXVHlmb69Ok8+OCDdO/enWHDhrFu3TpEhLlz53rF+frD1hhT4Ukll0MrOconm9Xu7K6qgkoOwG86NODtr39i5so99E2uizWg9Pz69LnzHD7t4Hc3J1TqWR0TonhjfQo//HyGGxtHVbbJSlWrylZS/CkiIoK1a9ciIsTFxREfH1/mP1Rz585lwoQJTJw4kZ49exIZGcl3333H2LFjS0wzLv7XflBQUImYWrVqYbFYvGKAEnHF+bq353XHjx8nPDyckBDv5Srq1KlT5n0tFgurV6/mySefZOTIkTgcDrp27cq8efPKHAB98uRJAFq2bOnz/OHDh0lIcP7+i42NLXE+NjaWY8eOAdC3b18WLFjAvHnzePnllwkLC2PYsGHMmjWr1BlvQUFBtGvXrszPBrirSRUVFxdH165d2bZtm/tYZGQkWVlZJWKzsrJ8VniqmlZylE82a6izu6oKKjkAgQEWJg1I4tCpXD7437QyYys7HqfIDY2cPzi6KKBSVSswMJCOHTvSoUMH6tevX+5f4osXL2bw4MHMmDGDW2+9lRtvvPGKmWruKS4ujpycnBLJUkZGRrnXJiUl8emnn5KVlcXatWvJy8vjjjvu8Bo0XVxUlPOPr+XLl/usoLRt29Yd66s6lJ6e7lU9Gz58OFu3buXEiRPMmjWLhQsX8swzz5T6/EOHDrkrcmW91q9fX+7n98Xz+yIpKanE2Jvz58+TkpJSYqxOddBKjvLJZrWTExDomkJeNW5pHkvnxGhe/mo/99xQn/AQq8+4HUfOIAKt61cuyYkOCyYxJlTH5SjlZw6Hw2vNFID333/fT60pXdEChsuWLXOPAXI4HKxZs4bw8PAK3cNqtdK7d2/Gjx/P/fffT1ZWFlFRUT4rUp07d8Zms3H06FH3QOTSpKen8+2337q7rNLS0ti2bRsPPvhgidg6deowatQolixZUmIGlqei7qryNG/evNwYTydOnOCbb75h5MiR7mO33347H3zwAampqe7q1LJly8jPzy9zHFVV0SRH+WQPtJNuCaiy7ipwZvdPDGjBwFe/5m/rD/JYf99Z/I4jWSTGhJaaBFVEh4RIvtqTXmP9vkqpkvr168e8efO4+eabadq0Ke+//z4HDhzwd7NKaNWqFQMHDmTMmDHk5OQQFxfH7NmzsdvtXt1jxe3YsYMJEyYwdOhQEhMTyczMZObMmbRt29ZdrUlKSmLVqlWsWrWK6OhomjRpQnR0NNOmTeNPf/oTqamp9OjRg8LCQvbt28e6dev47LPP3M+IiYnh97//Pc888ww2m42nnnqK2NhYRowYAcDUqVM5ffo0vXr1ck+xX79+Pc8//3yp7Q4KCrrslal37NjBpEmTGDx4MAkJCaSlpfHcc89hsVj485//7I77zW9+w4wZM7jnnnt45plnOHPmDOPGjeP++++v9jVyQJMcVQpboM3VXVX5KeS+tG4QwV3t4nlr408M65RAvQib13ljDN8fOUP362Iu6zkdG0eyeOsRUk6eo+klLEKolKo6Tz31FBkZGUyePBmAe+65h3nz5nkN8L1SLFy4kDFjxvDHP/6RsLAwxo4dS2JiYpkVj7i4OOrWrcuMGTM4evQotWvX5pZbbmHmzJnumMmTJ5OWlsaQIUPIzs5mwYIFjBgxgscff5z4+HjmzJnDSy+9REhICM2aNWPo0KFez0hISOCJJ55g4sSJpKam0rFjRz788EP3+KEbb7yROXPm8NFHH5GTk0NCQoI7gapO0dHRGGOYNGkSp06dIjw8nF69erF06VIaNWrkjrNaraxcuZJHHnmEIUOGEBwczH333cesWbOqtX1FpDo2VlQ1p2PHjqZoZkBVembTM6zZ+wkbpBEM/6JK7334dC59XlrPXe3imTW4rde5Y2ccdH7un0wbmMyIruVPcSzNgfQc+s7ewAv3tmHIjQ0vt8lKXZYff/yRFi1a+LsZ6hIUFBTQqlUrbr75Zt555x2/tGHEiBHs3LmT6vgdf6Ur72dGRLYaY8otR2klR/lkt9pxiKmygceeGkbZGd4lgbe+/omR3ZrQol4t97nvDzsrR20ruPN4aRJjwqhtt7I1NVOTHKVUuRYvXszRo0dp3bo12dnZvPnmm+zfv593333X301Tl0FnVymfbIE28jBczK/a7qoij9xyPbVCrDy3wnvU/Y4jWQRaxCvxqQyLRejQKFJ3JFdKVUhoaCgLFizgzjvv5Le//S0ZGRl88cUX3HTTTf5umroMWslRPhXtRJ6Xn0N1TPiMsFt55JbrmPHlj2zcn0H3653rUew4coakeuGEWC9tfQZfbnANPs48d75Su6Arpa4dAwYMYMCAAf5uhhfPfa5U5WglR/lkD7QD4Dh/ttqe8UCXBBpE2njuyz0UFhqMMew4kkWbS9yUszRFCwG+9+/UKrmfUkqpXxdNcpRPNquzkuMwBVCQXy3PCA4M4LH+zdl9LJul//czh07lkp1XQNtKLgJYXMeESAa0juOlNft4ee3+Cm02p5RS6uqhSU4licgIETE+XqM9YkREnhCRwyLiEJENIlJiLW0RSRaRr0QkV0SOisjTInL5/TWXoai7KtdSNftXlWZgm3ha14/gxVV7+e4n5/iZqqrkWCzCvPvac+8NDZizdh/PrdijiY7yG/3eU6piqvJnRcfkXL7egMPjfYrH/08EpgCPAXuA8cBaEWlljDkOICKRwFpgN3AX0BR4CWcCOrnaW18Kd3dV0f5VYWXv4VJZFotzgcDfvvlvnl+5hxCrhetjq25dm8AAC7N+04bQ4ADmb0jhbH4Bz9zVigCLLhCoao7VasXhcGC32/3dFKWueA6HA6u18ovBetIk5/J9Z4wpMXBFREJwJjnPGWNedR3bBBwCHuGXBGY0YAPuMcZkA2tEpBYwTURecB2rce5KjlT9goDFdW4aTZ+kWL7ak07HhEgCy9i8szIsFmH6nS0JCw7k9X8d5Fx+AS8OblvmJqFKVaXY2Fh+/vln6tevj81m01W4lfLBGIPD4eDnn3+mbt26VXJPTXKqTxegFvBx0QFjzDkR+QK4nV+SnNuBVcWSmY+AmUBPoGpX4qugoiTHYam6ncjLMvH2JNbtTad9o+rZlVZEePy2JEKDA5m1ai+55y/y6v3tCQ70a6+gukbUquVcEuHo0aNcuHDBz61R6spltVqpW7eu+2fmcmmSc/kOikg0cBCYbYx5w3U8CbgI7C8W/yPguW53EvBPzwBjTJqI5LrO+SXJsVudZfVcqd4xOUWurxvOZw93pXF09e5QPPaW6wgLDmTqsl38v3e28MbvO2AP0h8DVf1q1apVZb+4lVIVo/X6yjuGc7zN74GBwP8CfxORca7zkcBZY8zFYtdlAnYRCfKIy/Jx/0zXuRJE5CER2SIiWzIyMi7zY/j2SyXHUiOVHHCuchxhr5p+2LIM79KYWb9pwzcHTvLA25s549C/rJVS6mqkSU4lGWNWGWOeNcasNsasMMY8gLNrarKIFH1dfQ0RFx/nSovzOcTcGDPfGNPRGNOxTp3qGRDsTnJEID+nWp7hT4M7NuTV+2/g+yNZ3P/mvzl1tnqmySullPIfTXKq1idAFNAYZyUm3MdU8NpArjGmqHyQ6TpWXAS+Kzw1oqamkPvTgNb1mP9ARw6kn2Xo/H9zIjvP301SSilVhTTJqR4G55TxAOC6YueSXOeK7HEdcxORhkBosbgaFWgJJMgShCMwuMa6q/zhluaxvDPyJo5lOXj4/W26lolSSl1FNMmpWvcCJ4FU4FsgGxhcdFJE7DjH76zwuGYF0F9Ewj2ODcW59s766m5wWWxWG47AoGqfQu5vnRKjmTigBVtTM/l3im7oqZRSV4sqS3JcKwBvFZEcEckUke0iMtvjfKyITBORxlX1TH8SkU9F5C8icruI/IeI/ANncvK0MabQGJMHPA88ISJjRaQPsBjn1/wVj1v9DcgHlohIXxF5CJiGc6aWX0sotkAbuYFBV3Ulp8jgDg2ICQvm9X8d8HdTlFJKVZEqSXJEZBLwFrAKuAd4APgcuNMjLBaYinO8ytVgLzAS+BRn8pIMPGCM8UxgngdmAJOA5TjXzelnjDlRFGCMyQT64Oza+gKYDszB+bXyK3ugHUdA4FU7JsdTiDWA/+zWhI37T/LDkau7cqWUUteKqqrkPAK8YYx5whizxhjzhTFmGnB9Fd3/iuP6rM2NMXZjjM0Y08EY849iMcYYM8MY08AV090Ys93HvXYbY3q7YuoZY6b4mHpe42yBNhyWgGuikgMwrFMjwkMC+e/1Ws1RSqmrQVUlObWB48UPGtcoTlcX1Q+uw+uKNrMsihORKBF5Q0ROiEieiHwrIjd73st1zXgReVlETotIloi84rHeDCJSW0Tecm1ymSciaSLyZhV9xmuOLdBGrsVyTVRyAMJDrDzQOYEVO49zIL3ETh1KKaV+ZaoqydkGPCoiw12r/xZ3DPid6//HAp1dL0QkGOcGlf1wbmR5N5CBcyPLuGL3+S+ggetezwIP4ewOKjIb6AaMA/oDT1DKWjOqfHarHYdwVa6TU5oHuzYhONDCG+sP+rspSimlLlNVrWc/FlgKLASMiPyIc6zKi8aYbGNMvojscMXuNsb82+PaYUAroKUxZj+AiKzFOeblv3AmPkVygMHGmEJghStBelJEnjPGnAZuAl4zxizyuOa9KvqM1xxboM25vfo10l0FEBMWzH03NuK9f6cyrl8z4mvb/N0kpZRSlVQllRxjzA6gBc6Bxq/jXK13CrBFRMLKubwvsBX4SUQCRaQo8VoPdCwW+7krwSmyBOcO3q1c7/8PeExEHhaRZpX+QAooSnIK4UIuXLx2tj74Q49EAN7cmOLnliillLocVTaF3BiT7xpw/IgxJhn4fzgHHv9nOZfGAJ2AC8VeDwINi8Wml/K+nuu/j+CsKD0F7BWR/SJyX2U+j3LOrsotGv98DXVZ1a9t46529flo82FOnzvv7+YopZSqpGpbDNAY8zZwmmKr+fpwGtgC3OjjNahYbGwp74+5nplljPmjMSYOaItz08z3RSS5sp/jWmYLtOEo2n3iKl8QsLgxvRLJK7jIwm9+8ndTlFJKVVJVrZNTPPlAROrg3H+paE2Yoj+JQ4qFfoVz64M0Y8yWYq8fisXe5bH5JTjX5HEAO4s/39WF9hjOz1heoqV8sAXaKDCFXIBralwOwHWx4dyaXJeF3x4iJ+/a6apTSqmrSVUNPP5BRD4HVuPsQkoAJgC5wDuumDScCclwETkDXDDGbAHeBUYD/xKRF4EUIBrnIOLjxpg5Hs8JBxa7poW3xNkt9apr0DEi8jXwGc6kxwB/AM4Bm6voc15T7FY74NykM+IamUbu6eFe17Fq1wk++N80RvVs6u/mKKWUukRVleQ8DdwFzMO5C/dxnHs3DTXG/ARgjMkTkT/gXMl3PWAFxHX8Ftc9pgN1cSZKm4FlxZ7zEpAIfIizQvMWzmniRTYBI3CuqnwR2A7cbow5UkWf85pStBO5QyxEXGOVHIC2DWvT7boY3vr6J4Z3aUyItfiG8koppa5kVZLkGGNeA16rQNz7wPs+jp8B/uR6leW8MeYRnAOMfd3/MbynnKvL4E5yLHJNDTz29HCvptz/1v/y6bYj/O7mBH83Ryml1CXQXchVqeyBru4qkWtm1ePiOjeNpm3D2ryxPoWCi4XlX6CUUuqKoUmOKpXNWlTJsUD+tTW7qoiI8HCvpqSdzuV/fjjm7+YopZS6BL+aJMcYI8aYV/3djmuJu7sqMPiareQA9GtRl+tjw/jvfx3EtR2bUkqpX4FfTZKjal5RkpMbZL/mppB7sliE0T2bsud4Dv/cU3w9SqWUUlcqTXJUqYrG5Distmu6kgNwZ7t46te28bpWc5RS6ldDkxxVKnd3lTXkmq7kAFgDLDzUI5GtqZls/um0v5ujlFKqAn71SY6IWEVEFzCpBu7uKmvQNTuF3NPQGxsSExbE6/866O+mKKWUqoAaS3JEZKGIbBGRu0Vkj4jkicjXnvtKiYhFRCaKyAERyReRfSIyvNh9/iUin4jIQyJyEMgD4mvqc1xLQgJDEARHQNA1310FEGINYGS3Jqzfl8HY97dx+HRujT7/TO4FHlywmX0nNOFUSqmKqKoVjysqAZgNTMG5xcN0YJWIXG+MyQNeAYbjXP14G9AP+LuInDLGLPe4T1egKfAXnFtHXJvzm6uZRSyEBIbgsARe891VRf7QPZHzBYW8sT6FNT+e4D+7NeHhXk0JD7FW+7Pf2XSIdXszuLFJFM3qhlf785RS6teuppOcGOAuY8y3ACKyFTgIjBCRtcAY4EFjTNF+V2tFpB7OrSA8k5zaQHtjzPGaa/q1yRZowyEBWslxsQZY+HPfZtx3YyNeWLWH//7XQRZvOcx/3dqcIR0bEmCRanmu4/xFFn57CIC9x7WSo5RSFVHTY3LSixIcAGNMKrAV52acfYBC4DMRCSx64dylvF2xcTdbNcGpGfZAO7ligfM5UHjR3825YsRFhDB7SDs+H9uVxtGhTFryA3fM28i3B05Wy/MWbz3M6XPniasVokmOUkpVUI0nOaUcq4ezyhOAs+vpgsdrIc6KUz2Pa05UayuVm81qw1FUnNDBxyW0bVibxaM789r9N3A2v4D73/pf/vDuFn46ea7KnlFwsZA3N6ZwQ6Pa3N2+PgczznJBt5hQSqly1XR3VWwpx3YBp4ECnONtfP0G90yQdKGSGmILtOG4cN75Jj8bbLX926ArkIhwR5t69GkRy9+/+YnX1x3k1jnreaBzY/7c9/rLHq/z5c7jHD7tYPIdyTjOX+TCRUNKxjmax+m4HKWUKktNV3JiRaRL0RsRaQTcAGwG/omzkhNhjNni43W+htuqcHVXGVfOqeNyyhRiDeDhXtexbkIvftOhAX//5ifGLfr+su5pjOFv/zpI0zqh9GtR153Y7NUZVkopVa6aTnJOAv8QkftFZBDwPzgrNAuNMXuBvwEfichfRKSPiNwhIo+LyFs13M5LIiL1ReSsiBgRCfM4LiLyhIgcFhGHiGwQkXY+rk8Wka9EJFdEjorI01fK2j+2QBsO4xqLo91VFVInPJjn7mnDpNuTWPvjCVbvqvzwsY37T7L7WDajejTFYhES64QSYBH2HteEUymlylPTSU4q8BgwDfgIyAb6u6aPA4wFngEeAL7EOR7nDmBDDbfzUs0Czvo4PhHndPmZwEBXzFoRiSsKEJFIYC3OLri7cE6f/y+c0+v9zpnkFDjf6DTyS/Jg1yYkxYUzbdkuzuUXVOoef1t/kLq1grmrvXMpqODAABJjQnXwsVJKVUCNr3hsjFlijGlmjAk2xnQ1xuz0OGeMMXONMS1d5+sYY3oaY971iOlljPlNTbe7NCLSHbgNeLHY8RCcSc5zxphXjTFrgcE4k5lHPEJHAzbgHmPMGmPM33AmOONFpFZNfIay2K12cgtdPYXaXXVJrAEWZgxqxdEzebz81f5Lvn7HkSy+PXiK/+zWhODAXwp7zePC2aNJjlJKletXv62DP7m6lF7BWX0pPne4C1AL+LjogDHmHPAFcLtH3O3AKmOMZwbxEc7Ep2c1NPuS2AJtOC7mO9/k65qLl6pDQhS/vakhb3/9Ez8eu7Qk8W/rDxIeEshvb2rkdTwpLpwjmQ7OVrI6pJRS1wpNci7PaCAEeM3HuSTgIlD8T/gfXec84/Z4Bhhj0nCu5OwZ5xe2QBuOgjzndDat5FTKX25LIsJm5cnPfqCwsGITA386eY4VO48zrFNCidlZzeOcBT7tslJKqbLVWJJjjBlhjOlYU8+rbiISjXP80HhjzAUfIZHAWWNM8RX0MgG7iAR5xGX5uD7Tdc7Xsx9y7QO2JSMjo3IfoIJsgTYMhrwAq47JqaTa9iCeHNCCbWlZLNpyuELXvLkxBWuAhQe7Ni5xrrlrSwfdw0oppcqmlZzKmwH8rzHmyzJifP3ZLj7OlRbn889+Y8x8Y0xHY0zHOnXqVKixlWUPtAPgCA7XSs5luOeG+tzcJIrnV+zh5Nn8MmPTc/L4ZOsR7r2hAbHhISXON4i0YQ8K0EqOUkqVQ5OcShCRlsBIYLqI1BaR2oDddTpCRGw4KzHhPqaC1wZyPao/ma5jxUXgu8JTo2yBNgActnCdQn4ZRIQZg1qRe76Av375Y5mxC785xIWLhTzUI9HneYtFaFY3nD06jVwppcpUo0mOiPxLRD6poWedFJFp1XT76wErsAlnkpLJL+NyjuAcjLwH5+KG1xW7tvgYnD0UG3sjIg2B0GJxfmGzupKcoDDtrrpM18WGM6pHU5Zs+5lvD/re4yon7wL/+Hcqt7eKo0lMaKn3SooLZ+/xHIzRxb+VUqo0NV3JeRiYVMPPrA5fA7cUe810nRuAc92cb3GuAzS46CIRseNcL2eFx71WAP1FxHON/qGAA1hfTe2vsKLuqtzgUO2uqgKP9L6ORlF2Ji/dSX5ByQ1PP9ycRk5eAaN6NC3zPs3jwsnMvUBGTtldX0opdS2r0STHGLPbGHPpC4ZcYYwxJ+V76nYAACAASURBVI0x//J88UvVZaMxZq9rgcPngSdEZKyI9AEW4/yav+Jxu78B+cASEekrIg/hXCxxdrFp5X7h7q6y2rSSUwVCrAE8fVdLUjLO8eaGFK9z+QUXefvrn+icGE3bhmXvEVaV2zvkXdDd5ZVSV6cKJzki0k1E1ru2HjglIm8WVR9EZIRrS4MbRWSjawuDfa6tGzzv4dVdJSINRORjEUl3XXNQRJ4pds0QEflBRPJd2yPMEJHAYjE9ROR7EckTka2e+2MVi7vLNSspT0SOi8gLInJ5uyeW7XmcA5QnActxrpvTzxjj3kXdGJMJ9MHZtfUFzoUA5wBTq7FdFeYeeGwN0UpOFenVPJY7WtfjlX8eIPXUL7uVf779KCey8xndq+wqDvwyw+pyBx9v3J9Bm+mrvdqhlFJXiwolOSLSFfgKOA78Bvgzzm6ZBcVCFwGfA/cAPwCLRaRtGbd+F2gIPIRzUbwZQLDHc2913XMbzi0PXgEmAK96xMTj7PI57WrbG8D7/DIQuChuCLAE52agd+JMJh4CnqvI16A8xpiFxpj/3969x8dV1okf/3zPXJKZ5tZceqXXtLSUO9ZKC4gKAkWRVWFRf7q6rsvP9YK7oAisCLKw3lGE3UUXd911f654wQt3AUUupYUicistpWmhlF7Spm2azGQyM+f7++OcSSeTSTKTJpmZ9Pt+veY1M+c85+Q5Ocnkm+f5Ps8jqtqVtU1V9QZVPUJVI6p6mqo+k+fYdar6Dr/MdFW9Os/Q85LI5OTEgmGbDHAUXf3uJYQCDl/+zYuoKq6r3PrIJpZMr+OtC5uHPb6ppormmqpDnvn4wXU76U25PLxhbKciMMaYUggOXwTwWiRWqepFmQ0isg14SESOySp3m6p+y99/P7AOrxXjA4OcdxnwQVW903//cM7+64CHVfWj/vv7RATgqyJyvaq+jhdw9QDvUtWY/7W7gf/Jqqvg5cn8t6p+Kmt7AvgXEfmqqu4p7FtxeOlryQmGvNFVqiAyzFFmONPqq7nsrCP5yp3ruOf5HYQCQlt7Nzd94ASkwO9vJvn4UKzZ3AHAY6/s5qMr5h7SuYwxptwM25LjJ8suB34mIsHMAy/5Ngm8Kav4rzIvVNXFa9VZNsTp/4wXsHxMRPrNXe8PvT4JL48l2+1+vZf775cBD2QCHN8dOcccCczOcw2/x5ux+BhMXn05OYEgqAu9+dYhNSPxkZPncMzMOr5y54vc/PtXmNUY4V3HTi/4+EXTanl55wHSBc6inKuju5f1Ow4QDjisbttDKu2O6DzGGFOuCumumoyXL/KveEFN5pHAG0Y9K6vsrpxjdwFDfWpfBKzFy0F5VUT+7CfoAjT759+Zc0zmfaP/PC3366pqnP6rgmfa/+/JuYbN/vbsazBZ+kZXOf50PzZXzqgJBhxu+Itjae9K8Py2/fztafMJBgofC7BoWi2JlMtrHbHhC+fx5Gav8fJDb5nNgZ4UL7xhOVfGmImlkE/UfXgz714DvDnP4z+yyk7JOXYKsH2wE6vqNlX9GNCE1zKzA/itv2TCbrxAJPecU/3nDv95R24ZfzK+mqxNmbIXD3IN2UO6TZZQIERQgsQdvwvFko9H1fGzGrj4rfOZ0xTlwjcVF2sfTD4e2T1Z3dZBdcjhk6d7ic6Pv5J/7h5jjKlUwwY5/srZq4FFqro2z+ONrOJ9o6lExMFLFn6ygK/hqupqvGTgKDDHT7x9mqx5Znx/Cbh4E/EBPAW80+9Wy3hfzjEbgG3A3EGuwfJxhhAJRohn8kRsGPmou3LlUTx06elEwrmTYw/tyKm1iDDi5OPVbXtYOqeRafXVHDW9zoIcY8yEU2ji8eV4ScYu8AvgAF6Oy7uAf8wq9wkR6QVeAP4Wb7bfD+Y7oYjUA/fjjbB6GW9U1WV4LTOZee+vAe4Xkf8Efgoci7co5r/7SccA3wU+DdwlIjcCM/CSneOZr6WqrohcBvxYROrwWm56gfnAXwAX5OT0mCyRUIRYZhkta8kZE8V0U2VEwgHmNEZHlHy818/H+fxZXm/yKa1N/PfqV+lJpqkOFRdsGWNMuSrok1VVHwPeCrQAP8abz+VyYCv9c2Y+gNea82vgeOCifEOmfT14w8w/B/wW+C8gBpzl59Sgqr/zz7nU/5p/D3wb+ExW3bbhDWdvBn6JN6vyh/1zZV/D7XgtSyfgJTPf4Zf9E17AYwYRDUaJ4yel2jDysrJohCOsMqOqTp7fBMApC5vpTbms3bJ3VOtnjDGlVGhLDqq6Bjgn376sIa/rVPWUIc7xtqzXCbzWnuG+7u14I6qGKvMwcFzO5gGTjajqvVj+TdEiwQhx15+2x1pyysqiaXU8sG5n0S0wq9v2UB1yOO4Ib2blZXMbCTrC45t2c2oB8/QYY0wlsFXIzbAiwQjxzKLplpNTVhZNrcVVeGVXcUP7V7ft4U1zJhMOeh8Bk6qCnDi7gVWWl2OMmUAsyDHDioQixNK9II4NIS8zmTWsikk+3hfrZcPOA5w8r6nf9lMWNPPctv3sjyVHtY7GGFMqoxLk5FvSwEwc0WCUeCoOVbXWXVVm5jZFCQedooaRr9ncgSqc3DowyFGFJ9pssKExZmKwlhwzrEgw4gc59dZdVWaCAYeFU2qKask5mI9T32/78Uc0EA0HbCi5MWbCsCDHDCsSjBBLxaC6zlpyylCxI6xWt3XwpjmTqQr2T1QOBx3eMq+RxzdZkGOMmRgsyDHDOthdVWctOWVo8bRadh1IsLd7+JkQ9sV6Wb+jk7fk5ONknLKgmbb2brbvj+fdb4wxlcSCHDOsSDBCIp0gXVULPTZPTrk5MrO8w87hW3OezOTjzB88yAF4/BXLyzHGVD4LcsywoiFvxYx4VdRacsrQ4ml1AAV1Wa1u66Aq6HD8rPq8+xdNraVpUtiGkhtjJgQLcsywIsEIAPHwJMvJKUNT66qoj4QKSj7OzI+Tm4+T4TjC8tYmHt+0G1Ud7aoaY8y4siDHDOtgkBPx5smxP35lRUT85OOhA9B9sV5e2tE5aFdVxqkLmtnZmWBTu80IYYypbBbkmGFFg153VSxYBW4SUj0lrpHJtXhaLS/v7Bqy9WW4fJwMy8sxxkwUFuSYYfW15ISqvA3WZVV2jpxaS1cixbZ9g4+KWrN56HycjFmNUWY1RnjM8nKMMRXOghwzrEjID3ICYW+DJR+XncX+8g5DJR+vbtvDSbMHz8fJduqCZla37SGVdouuy48e38x5Nz+G61q3pjGmtCzIMcPq664K+IvWW0tO2TlymDWs9seSrNs+fD5OxorWZg70pHjhjeLu9et7Y3ztvvU8v20/LxWx1IQxxowFC3LMsPq6qxz/xyVhc+WUm7rqEDMbIoO25Dy5JZOP01jQ+Vb461oVu8TD9Xe91JeX/sQmy+kxxpSWBTkjJCIXiMgqEdkjIj0iskFEviQi4awyIiJXichWEYmLyCMickKecy0RkYdEJCYib4jIdSIyfJ/CODkY5Ii3wVpyytKiabW8PMiEgGva9vj5OA0FnauppoqjptcVFeQ88nI79724g0vOWMj8lkmssiDHGFNiFuSMXBPwB+ATwErgP4B/BG7MKnMFcDXwdeA8oAt4UESmZQqIyGTgQUCB84HrgMuAr4z9JRSmbzJA8YOcROHrJJnxs2haLZvau0jmyaNZvXkPJ85uoDpUeOx8SmsTa1/dS08yPWzZRCrNtb99kXnNk/jEafNYPr+JJzd3jCinxxhjRosFOSOkqt9X1X9U1V+p6h9U9et4Ac6H/Racarwg56uqeouqPghciBfMfCbrVJ8EIsD7VPUBVb0VL8C5VETqxveq8qsOVAMQw++HsMTjsrRoai3JtNLW3t1v+/54khffKDwfJ+OUBc30plzWbtk7bNkfPraZtt3dXHPeEqqCAVa0NtOVSPH8NuvaNMaUjgU5o2sPkOmuWgHUAT/L7FTVbuBOvJafjJXA/aqaHTn8FC/wOX1Ma1uggBOgKlBFXP3/6K27qiwt6ks+7n9/nipwfpxcy+Y1EnRk2FXJ39gX5+aHXuGsJVN526IpwMHcH+uyMsaUkgU5h0hEAiISFZFTgUuAf1NvRrbFQBrYmHPIS/6+jMXA+uwCqvoaEMspV1KRYIRYugfCtdaSU6ZaW2oIOjIg+Xh12x7CQYcTCszHyZhUFeTE2Q3D5uXccPdLKMrV717St62pporF02ot+dgYU1IW5By6bv/xKPBH4Av+9slAl6rmJjTsBaJZCcqTgX15zrvX31cWosEo8VQcquusJadMhYMO81smDQhy1mzu4KQi83EyTlnQzPPb9rM/lsy7/7GNu7n7+e18+m0LmNUY7bdveWsTT23pIJEaPqfHGGPGggU5h24FcBpesvD5wC1Z+/LNhiZ59g1WLu9saiJysYisFZG17e3txdd4BCLBiBfkVNXZEPIytmhaHRuyRlh5+Tj7ecu84rqqMk5Z0IwqPNE2sEWmN+Xy5d++wJymKH/71vkD9q9obSaRcvnza/lieGOMGXsW5BwiVf2Tqj6mqjfidVf9nYi04rXE1OYZCt4AxFQ186/xXn9brnryt/Cgqj9Q1aWqurSlpWV0LmQYkWCEWCoGVbXWklPGFk2t4fW9cboSKQDWbunAHUE+TsbxRzQQDQfydln9x+ObaWvv5trzjs7bSrRsXiOOWF6OMaZ0LMgZXX/yn+fh5dkEgAU5ZXJzcNaTk3sjIrOASTnlSioaihJP+t1VlpNTthZN8wbkZbqsMvk4J84uLh8nIxx0eMu8xgHJx9v3x/neQxs586ipvH3xlLzH1kdCHDuz3vJyjDElY0HO6DrFf94MrAI68YaNAyAiUbz5cu7NOuZe4GwRqc3adhEQx8vxKQv9u6tsnpxylbuG1eq2Dk6cNbJ8nIxTFjTT1t7N9v0HF/+84e6XSLvKNectGeJIOLm1iWe27iXea3k5xpjxZ0HOCInIfSLyeRFZKSJnichXgG8Dt6vqJlXtAb4GXCUinxaRM4Cf433Pb8461a1AArhDRM4UkYuBa4Ebc4aVl1RfkGOJx2VtZkOESeEAG3Z00tnj5eOMtKsqY0VrMwCPv+K1yKzatJu7ntvO372tdUCycb5jk2ll7asdh1QHY4wZiWCpK1DBngI+BswFUkAbcCVe0JLxNbyg5kq8GZLXAu9U1Z2ZAqq61w+AbsGbQ2cf8B28QKdsRENRYskYTLLuqnLmOMKR02rZsPPAIefjZCyeVkvTpDCrXtnN+SfM4JrfvMjsxiifPL112GPfPHcyQUdYtWkPpy0cn/wxY4zJsCBnhFT1arwlG4Yqo8AN/mOocuuAd4xe7UZfv5acVA+keiEYHv5AM+4WTa3l/hd38MSmPYQDI8/HyXAcYXlrE49v2s2PHt/Cxl1d/PCjSwvqAouGvbl2LPnYGFMK1l1lCnIwJ6fe22CtOWVr0bRa9saS3PP8Dk4Y4fw4uU5Z0MzOzgTfvH8DZyyewhlHTS342OXzm3j+9X109uSfa8cYY8aKBTmmINFglJSmSPqLddJjc+WUq8zyDtv2xQ+5qyrj1AVeXg4C15x3dFHHLm9txlVveQljjBlPFuSYgkSCEQBi4Spvg7XklK3F0w6u65pZQ+pQzWqMcsbiKXzxnMXMbho62TjXibMbqAo61mVljBl3lpNjCpIJcuKBMPVgI6zKWOOkMC21VeyPJTlp9uitDPLDj715RMdVhwIsnTvZghxjzLizlhxTkKjfTRUL+cnGNldOWVs2r5FTFzaPSj7OaFg+v4mXtnfS0d1b6qoYYw4j1pJjCtLXkuP4fzStu6qsffeiE9C8K5+VxvLWZuBl1rTtYeWx00tdHWPMYcJackxB+nJyAn5cbN1VZS0UcAgHy+fX+7gj6pkUDliXlTFmXJXPp6Apa30tOeIvom4tOaYIoYDDsnmNrNo0cKFPY4wZKxbkmIJEg35OjpuAUNSGkJuiLW9tYlN7Nzs7e0pdFWPMYcKCHFOQSMhvyUnGoarWWnJM0TJrYK1usy4rY8z4sCDHFKSvuyqzErnl5JgiHTW9jvpIiFWvWJBjjBkfFuSYgvR1V6Vi3vpVNoTcFCngCCfPb2RVm+XlGGPGhwU5piBVgSoEOdiSY91VZgSWz29ia0ecrR2xUlfFGHMYsCDHFERE+q9Ebt1VZgRW+GtgPWF5OcaYcWBBjilYNBQlloxZS44ZsYVTamiuCfOEzZdjjBkHFuSYgh1syam3lhwzIiLC8tZmVm3ajZbTlMzGmAnJghxTsL4gp6oWkt2QTpW6SqYCLZ/fxM7OBG27u0tdFWPMBGdBjilYNBg9mHgM1mVlRmRFaxOAdVkZY8acBTmmYJFg5OAQcrAgx4zInKYoM+qrLcgxxow5C3JMwQ52V2WCHJsrxxRPRDi5tYkn2vbgupaXY4wZOxbkmIJFQ1FvWYdMS44lH5sRWtHaTEd3Lxt2WqBsjBk7FuSYgvV1V1lOjjlEyy0vxxgzDizIMQXrN4QcrCXHjNjMhghzm6KssiDHGDOGLMgxBYsEI/SkenDDNd4Ga8kxh2B5axNr2vaQSrulrooxZoKyIGeERORCEfmtiGwTkS4ReVpEPphTRkTkKhHZKiJxEXlERE7Ic64lIvKQiMRE5A0RuU5EAuN3NYWJhqIoSk8w7G3o2V/aCpmKtry1mQOJFC++YcGyMWZsWJAzcpcCXcA/AO8B/gD8REQ+m1XmCuBq4OvAeX75B0VkWqaAiEwGHgQUOB+4DrgM+Mo4XENRIsEIAHFcCIStJccckhWtTYQCwk+f2lrqqhhjJqhgqStQwc5T1d1Z738vIjPwgp+bRaQaL8j5qqreAiAiTwBbgM8AX/KP+yQQAd6nqp3AAyJSB1wrIt/wt5WFviCnbyVyGxljRq65pooPLZvN/6x5jYvfOp95zZNKXSVjzARjLTkjlBPgZDwDTPFfrwDqgJ9lHdMN3AmszDpmJXB/TjDzU7zA5/TRrPOhigajAAcnBLTEY3OIPvOOhYQDDjc+8HKpq2KMmYAsyBldK4B1/uvFQBrYmFPmJX8fWeXWZxdQ1deAWE65kuvXkhNphK6dJa6RqXQttVX8zanzuPPZN3hhm+V4GWNGlwU5o0REzsDLqfkXf9NkoEtV0zlF9wJREQlnlduX55R7/X35vtbFIrJWRNa2t7cfeuUL1C/ImX0ybF0DvbbIojk0f/vW+dRHQnzrdxtKXRVjzARjQc4oEJG5wE+A36jqj7J25ZuzXvLsG6xc3jnvVfUHqrpUVZe2tLQUXd+Rioa87qp4Mg4LzoB0L2x5fNy+vpmY6iMh/u5trTy8oZ01bTZvjjFm9FiQc4hEpBG4F3gN+HDWrr1AbZ6h4A1ATFWTWeUa8py6nvwtPCWTacmJpWIwewUEI/DKgyWulZkIPrp8LlPrqvjG/RtQtfWsjDGjw4KcQyAiUeAuIAy8y08szlgPBIAFOYfl5uCsJyf3RkRmAZNyypVcv+6qUDXMO82CHDMqIuEAl5yxkKdf3cvv1+8qdXWMMROEBTkjJCJB4OfAQmClquZ+Mq8COoELs46J4s2Xc29WuXuBs0WkNmvbRUAc+OMYVH3E+rqrUnFvw4J3Qscm6GgrYa3MRPGXS2cxtynKN+/fYKuTG2NGhQU5I/evwLnAPwGNInJy1qNKVXuArwFXicin/cTkn+N9z2/OOs+tQAK4Q0TOFJGLgWuBG8tpjhzI6q5KxrwNC87wnl95qEQ1MhNJKOBw6VmLWL/jAL999o1SV8cYMwFYkDNyZ/nPNwFP5Dym+/u+BtwAXInXrVUHvFNV+8Zeq+pe4Ay8rq078WY6/g5wzdhfQnFCToigEzzYktPUCpPnWZeVGTXvPnY6S6bX8e0HNtCbsjWtjDGHxoKcEVLVuaoqgzy2+GVUVW9Q1SNUNaKqp6nqM3nOtU5V3+GXma6qV+cZel4WosHowSAHYMGZsPkRSCVKVykzYTiO8IVzFrG1I87tT71W6uoYYyqcBTmmKJFgxBtdlbHgTEjG4LUnSlcpM6G87cgWls1r5KaHXiHWmyp1dYwxFcyCHFOUSDDSvyVn7qneYp3WZWVGiYjwxXMWsbsrwX8+vqXU1THGVDALckxRBgQ5VTUwe7klH5tR9aY5jZyxeAq3/nET+2K9pa6OMaZCWZBjihINRQ+OrspYcCbsWgf7t5WmUmZC+vzZi+hKpLj1jzZFgTFmZCzIMUUZ0JIDsPCd3rN1WZlRdNT0Os4/fgY/WrWZnZ09pa6OMaYCWZBjipI3yGlZDHUzLcgxo+7Sdy4ilVa+99DGUlfFGFOBLMgxRYkGo/1HVwGIeBMDtj0M6WTe44wZidlNUT64bDa3P7WVLbttxXtjTHEsyDFFyduSA15eTqITXl87/pUyE9pn37GAUMDhql89z54um4/JGFM4C3JMUSKhCPFkniBn3ukgAeuyMqNuSl01V797CU9t6eDMG//Ir5553VYqN8YUxIIcU5RoMEqv20vKzZmkLdIAs5ZZkGPGxIfeMpu7LzmNec2T+Ifbn+Wj//kUWztiwx9ojDmsWZBjipJZpDN/l9UZsP3P0NU+zrUyh4Mjp9byi0+u4Lrzj+bpLR2c9Z1HuO3RNtK2YrkxZhAW5JiiDB3knOk9b7KJAc3YcBzhr5bP5YFLT2dFaxPX3/0S7/vXx1n3Rmepq2aMKUMW5JiiRENRYJAgZ9rxMKnFuqzMmJvREOG2jy7l5g+eyLZ9cd5zy2N847719CTLcl1bY0yJWJBjipJpyRkw6zGA40DrGd4SD679sTFjS0Q47/gZPHjp6bz3xJn868ObWHnTozyxaU+pq2aMKRMW5JiiDNldBV6XVbzDy80xZhw0RMN888Lj+Z+/eQtpV/nQbat55GXLCzPGWJBjihQNDtFdBdD6dkBswU4z7k5d2Mx9f38arS01XHnH8xzosYkpjTncWZBjitLXXZU763HGpGaYcaLl5ZiSiIaDfOOC49i+P85X711f6uoYY0rMghxTlGFbcsDrsnr9KYjvHadaGXPQSbMn8zenzuMna15j1Su7S10dY0wJWZBjihIJ+Tk5+WY9zlhwJqgLm/4wTrUypr/LzlrEvOZJXP7L5+hOpIY/wBgzIVmQY4qSackZtLsKYOaboLre8nJMyVSHAnzjguPYti/ON+6zbitjDlcW5JiiVAergWG6qwJBaH2Hl5djawyZEnnz3EY+unwu//XEq6xus2HlxhyOLMgxRXHEoTpQPXSQA16XVdcO2Pni+FTMmDwuP2cRsxujfPGXzxHvtbmbjDncWJBjihYNRYcPclrP8J5tlJUpoWg4yNfffxyv7onxzfs3lLo6xphxZkGOKVokGMk/43G2uukw9RgLckzJLW9t4iMnz+E/V21m7ZaOUlfHGDOOLMgZIRFZICLfF5FnRSQtIg/nKSMicpWIbBWRuIg8IiIn5Cm3REQeEpGYiLwhIteJSGBcLmQEIsHI8C054K1K/tpqSBwY+0oZM4QrVi5mRn2Ey3/xnK1vZcxhxIKckTsaOBd42X/kcwVwNfB14DygC3hQRKZlCojIZOBBQIHzgeuAy4CvjFnND1E0WEB3FXh5OW4SNj8y9pUyZgiTqrxuq7bd3dz4wGC/rsaYicaCnJG7U1VnqeqFwIDsWhGpxgtyvqqqt6jqg8CFeMHMZ7KKfhKIAO9T1QdU9Va8AOdSEakb86sYgUgwMvQQ8oxZJ0O4xrqsTFk4dWEzH1w2i9sebeOZ12yiSmMOBxbkjJCqusMUWQHUAT/LOqYbuBNYmVVuJXC/qnZmbfspXuBz+ujUdnQV3F0VDMO8020ouSkbV517FNPqqvmCdVsZc1iwIGfsLAbSwMac7S/5+7LL9ZutTFVfA2I55cpGJFRgkAOw8EzY95oNJTdlobY6xFfffxyv7Oriew/l/moaYyYaC3LGzmSgS1Vz/13cC0RFJJxVbl+e4/f6+wYQkYtFZK2IrG1vbx+1ChcqGowOP7oq46j3gBOE524f20oZU6DTj2zhwjcdwa1/3MRzr+f71TPGTBQW5IytfH00kmffYOXy9vGo6g9UdamqLm1paTnEKhav4O4q8FYlX/BOeP7n4Fr3gCkPX3r3Elpqq7jil8+TSg/X82yMqVQW5IydvUBtnqHgDUBMVZNZ5RryHF9P/haekssEOVpons3xF8GB7bD5j2NbMWMKVB8Jcc15R7Nueyf/9cSrpa6OMWaMWJAzdtYDAWBBzvbcHJz15OTeiMgsYFJOubIRDUVJa5pet7ewA45cCVX18Kx1WZnysfKYabxtUQs3/m4D2/cX2DJpjKkoFuSMnVVAJ96wcQBEJIo3X869WeXuBc4WkdqsbRcBcaAsmz4iwQgA8WSBfxhC1XD0X8BLd0KiawxrZkzhRITr3nMMKVe57s51pa6OMWYMWJAzQiISFZELROQCYCbQknkvIlFV7QG+BlwlIp8WkTOAn+N9z2/OOtWtQAK4Q0TOFJGLgWuBG3OGlZeNaDAKDLMSea7jPwDJblh/1xjVypjizW6KcskZC7n3hR38Yf2uUlfHGDPKLMgZuSl4QcvPgZOBJVnvp/hlvgbcAFwJ3IU3b847VXVn5iSquhc4A69r6068iQC/A1wzLlcxApmWnIImBMyYdTI0zIZnfzpGtTJmZP72tPm0tkziy799wVYqN2aCsSBnhFR1i6rKII8tfhlV1RtU9QhVjajqaar6TJ5zrVPVd/hlpqvq1XmGnpeNvu6qYlpyHAeO+4CXfNy5fYxqZkzxwkGH6//iWLZ2xLnlDzZ3jjETiQU5pmgjCnLA67JS1xtObkwZWd7axPtOmskPHmlj405bUNaYicKCHFO0aGgEOTkATa0wc6l1WZmydNW5RxENB/nSr18ofHqEHHu6EriuLWFiTLmwIMcUrS8np9BZj7Md/wHY9SLseH6Ua2XMoWmuqeKKlYtZs7mDO/60rahj067ynQdeQpmpUQAAGpZJREFU5s03PMhH//NJ2g8kxqiWxphiWJBjijbi7iqAY94PTshac0xZumjpLE6a3cAN97zEvlhh80Dt2N/Dh/59NTc9tJFTF7bw5OYOVt70KI+/snuMa2uMGY4FOaZomSHkRY2u6ju4ERae5eXlpFOjXDNjDo3jCNf/xbHsjyf5+n3Dz8X5+/U7WXnTIzy/bT/fvvB4/vvjy/jtZ05lcjTEh3+4hm//boMtG2FMCVmQY4oWCR1CSw54XVZdO2Hzw6NXKWNGyZIZdXz8lLn875NbefrVjrxlelMu19+1jo//aC3T6iPc+dlTef+bjgBg0bRafvOZU7jwTUdw8+9f4UP/vsZmVDamRCzIMUULO2EccUaWkwNw5NlQ3WDLPJiy9fdnHsn0+mr+8VcvkMxpiXl1TzcX3LqK2x7bzF8tn8OvPrWC1paafmWi4SDfuOB4vnPR8bzwxn7OvelRfr9+J8aY8WVBjimaiBANRkfekhOsgqPf681+nLDhuqb8TKoKcs15R7N+xwF+9PiWvu13PvsG7/reY2zZ3c2tH34T151/DNWh3DV4D3rviUdw12dPZXp9hI//aC033L2O3pR1XxkzXizIMSOSWYl8xI7/ICRj3npWxpShs4+eyhmLp/CdB19mU3sXV/zyOT77v8+waFot93zuNM45ZlpB55nfUsMdn1rBXy2fw78/upkLv/8EWztG2ApqjCmKBTlmRCLByMgSjzNmLYPJ82yUlSlbIsK17zkaV5VzvvsIt6/dyqfe1spPLz6ZIyZHizpXdSjAdecfw7/9n5Noa+/i3O89yu1PvUas15LvjRlLFuSYEYmGomzr2oarI2x6F4HjLoLNj8D+4uYkMWa8zGqMctW5RzGtvpr//vgyLj9nMaHAyD82Vx47nXsuOY3Wlhq++MvnWXr9g1x6+5955OV2G4VlzBiQkc7sacrD0qVLde3ateP+dX+87sd846lvcOGRF3L1yVcjIsWfpKMNvncinHktnPoPo11FY8qW6ypPbeng13/exl3PbedAT4qW2irec/wM3nviTI6eUTey3yljDhMi8rSqLh22nAU5la1UQQ7ATX+6iduev42PLPkIX1j6hZF9KP/wLOjphE894bXuGHOY6UmmeXjDLn71zDZ+v34XybSyYEoN7z1xJu85fgazGovrGjPmcFBokBMcj8qYiemSEy8hnorz43U/ZlJoEp8+4dPFn+S4i+DuS2HHczD9+NGvpDFlrjoU4JxjpnPOMdPZF+vlnud38OtntvHN+zfwzfs3sGxeI5e8YyGnLmwudVWNqTgW5JgRExEuf/PlxFNxbn32ViLBCB8/5uPFneTo98J9V3hz5liQYw5zDdEwH3rLbD70ltls7Yjx22ff4CdrXuPDP1zDW49s4YpzFrNkRl2pq2lMxbDEY3NIHHH48slfZuXclXzn6e/wv+v/t7gTRBu9yQFtmQdj+pnVGOXTb1/AQ5edzpfedRTPbt3Hu25+lEt/9me27bMZlI0phAU55pAFnAA3nHYDb5/1dv55zT/z61d+XdwJjvsAdO+Ctj+MTQWNqWDVoQCfOG0+j3zh7Vx82nzuem47b//Ww3z13pfYH0uWunrGlDULcsyoCDkhvnX6t1gxYwXXrLqG+zbfV/jBC8+CyGSbM8eYIdRHQ1x57lH84fNv493HTecHj7Tx1m/+gdsebSORSpe6esaUJQtyzKgJB8J89+3f5YSWE7jy0St5eOvDhR0YDMMx74f1d3sjrYwxg5rZEOHGvzyBuz57KscdUc/1d7/EO771R379zLYB62wZc7izIeQVrpRDyAfT1dvFJ373CTbu3cgtZ9zC8hnLhz9o61PwwzNh4dkw7zSYchS0HAV1M2xouTFDeHRjO1+9Zz3rtnv/IIQDDpFwgGjfIzjgfW11kBn1EWY0RJjRUM3MyRGaJ1XhOPa7ZiqDzZNzmCjHIAdgf2I/f33/X/P6gde59cxbOWnqSQPKqCqKes/qwt2Xwcv34XTtRAABqKr3Ap5+jyUwqRnSSejtznp0ec/JWNbrODgBCFR5C4MGq/zXYQhW938tDqgC6j2re/B19jYRCIT981X7r6u9987gizXipr36pHr85wSk4pDsATeTWyGk1CXhpujRJIl0kh5NkXCTJNxeEpomEIoSDtcRrqojXF1PKBQh7IQJB7xHyAkRckJlO5mcqy6xZIzuZDexVIyQEyISjBANRakOVJdtvUdFOuX9fCbj3s9S5mcyWD30z84wXFe578UdvLKri1hvmlhvilhvmnj262Sa7kSKeG+a/fEk3b39u7jCAYfpDdV9wc/MhmqmN0QIBxxcVVQhrYqriqve76/req9dVUSEcNChKuAQCgrhQIBw0PEeAe+5yn9EwgFqqoJMqgoe0gzSg1FV4sk0nfEUnT1JOuNJDvR4r6uCAeojIeoiQeqqQ9RFQtRWBS3AO0SqStpVkmmlN+2SzDxS3vs5TdFRvdcW5BwmyjXIAdgd381f3/fXbOncgiMOmZ81pfCfOQcQBUERwFE9GABlGeq94x/vcLB/1lFwMuf03xdDAVe858yhLoIK/llBM3+sVZGsaxbtX0dBSYuQ8B+pUfojHwQCCA5CEHAQAoNs639levCiMi/8excAggghHIIi3mtxCOIQEiEoAYI4IBDTFN3q0q1pYqTpwqVbXeIy+DdbFCJAVMV/pu85hCCZuy8gOCDeNhHpew3if7+96xC//uIHqpl7Iar+9UBI/WcgqDnP/nWncUg6Qtq/R2lxSImQFCEN3jYgpWmSboqUmyKpaZKaJqUuSXVJoSRFSHqXQLWrhFWpVqUKqMLxHhKgWgJUOUHCEvACC5Q0rhdooKTUxQXSKK663jOCK4IrkEZQv07es/fzmfa/AyICKmjfA1SFtAuuQiqd+V67CC4iLuCCeMG/9j17D1D/d82/Cyr+75t4v8PqnS/z+xYAAkrfz2LmZytzT4L+tfSKkBSHXrzvdRL6voeZ92m8zwZHwXG954AqAf++BhSCqgTxfj/TOAcfKqQl4P2T4wTACeA4AUQER9MENI2jaYKaJkD/196zS0qgF6+uvY6QzNTVr2NKIOn/WgfVu7agZl5DSKXvddD/3mjfvXT8++rgCrji9O1TEUT876d4nzwBvJ/xAP5nG+p91ongEEDEQcT/JBDvO64SRMT7risOvW6SHjdBr9tLwu2llxRJTdJL2nstLr3idY0GFAIqWc+5r4UAwuXvvo0l844d9He/WDYZ4GGip6eHDRs29NvW2NhIS0sLruuycePGAcc0NzfT1NREKpVi06ZNA/a3tLTQ2NhIb28vmzdvHrB/6tSpNDQ00NPTw6uvvjpg//Tp06mrqyOqUa5uvZpVb6wi5aYQ/49QaHKIQHUAt8cltc8bNi5ZYUmwKYiEhFQ8RXJf0g+OFDfZA4lOnOBO0C7cVBS3dxIqDjhB/xHAaQQJhXATIdxYANRFNY3rpkHTuPVxII3GwI05qKZRN03mD7pbFwMHJB5GEuGcCEpwG7oRVSQWwkl453fU9f6Aahqp2YdoGmIRSFf1fXgqjvfpVd+DSgDik9B0EMT74AlJkHDQoaZRqHZCuJ0hAqkAIcchKN4fu0goQH1tkt5kN7t399CTSJBKJUi5CVLpJC4xnFA7vekEPfEGXDdIGnBFcQENJHDDe70/fD0tuOrQl8Uh4u2v6gQRAvEp9IWF4oWZ6WCMRKiTFEqgu5k0SholoRBDiYW6OBDaBypMi0+jGqEOoRqHaoTqUJzacIKohtBEM2EcL8BTJSFKOtxNbyhGzBV6Yw0kcEmg9KLEcOkJdZIMxZFUgEmJJj9g1r64LB7eRzIQJ+CGiSaa+u6aereOrqp9pAK9BNNVRHsb+oKEtP+8u2oPsUCCQKqKyb2TB/xs7w7uJhlIEk1FaUzU4qhk/TGBA9W7CDjKpHQNNakpBHAIiENQAlQ7AZI1nYRCQcLJGpxElRcEpVMkNcV+TbM7spMekgQTUYLJCEm3/78Eu6LbcRAm99YzKT3JC9LFCxwE2D+pHQeoSdRTnapGOLgPcYlHdiNAJFFPIB32Ahu/NTUlKTqr21GUaGIyjlahff8ICOqkiEf24kiIup5mghrGEcd74OAGUsSq9+GqS1WsAVwHF6/lR8WlN5DgQNVeXFVq4s2g/h9tvKAtFuxhb3gvrkBzfCrqB0cBBUeF3kA3iVAnQWBKbBoOXkBQjeKo0hPsJhbuIh0QJiWmkwQSDv49hgPhAxwIdSHq0Bxv4mCs7V1jV2g/PcFuAm6AxsSUvp8bb2+I/eEYsWCMgBumsacZzfpccFToDu8jHeihOh2mMdHkByvKJP8a0qEO0k4C160ilGrEFUgBcaBboCO8h3iwl0C6itreyX6gmPknD/ZXteNKkmgqQk2y3g8oD/4/sreqnVQgRVVqEtFkfdY/X94P/+7ITtKSpjpZQzRZi+LiSi+u/0/VjsgOVJTa3lpqUjUEXSWMElIIa4BE1U6qVGhMNhBJTyKk3j8zaSAtLt3VO0k5EOhtQNxqUkBaIOlATNJEQ15r9bZt2+jq6ur3exUOh5k3bx4AW7duJRbrv/hzdXU1c+bMAeDVV1+lp6dnwO/mYCzIMWOqvqqelfNW9ts2c+ZMampq6OrqYtu2gYtzzpo1i2g0SmdnJ9u3bx+wf86cOVRXV7Nv3z527tw5YP+8efMIh8N0dHTQ3t4+YH9rayvBYJA9e/awe/fuAfsXLlyI4zi0t7fT0dExYP+iRYsA2LlzJ/v27eu3z3EcFi5cCMD27dvp7OyfSB0MBmltbQXG5pc9Go0ya9YsADZv3kxvb2+//TU1NcycOROATZs2kUr1n5uorq6O6dOnA7Bx40Zct38ia0NDA1OnTgUYEFxD+QTYsViMrVu3Dthf6M/e/v372bZ9G67rktIUqkrACTB79mxqojUc2H+AXbt2DTh+tH/2VBUXFwcHEbGfvfH42Usk2Ny2yWu9DBz8EzleP3sj/dybM2cuBIK0797DrvZ2kmkl7bqkXCWVdmmePpuqqhDd+/fR1bmXQKYVSATBZfbsGQRIsnf3TlKJFKFQNTihvpzIQ/3Zm3tE64A6jwfrrioTIrIEuBlYDuwDbgO+oqpDjg0t5+4qY4wxZixYd1UFEZHJwIPAOuB8oBX4Nl4L+JdKWDVjjDGmYlmQUx4+iZdf+T5V7QQeEJE64FoR+Ya/zRhjjDFFsMkAy8NK4P6cYOaneIHP6aWpkjHGGFPZLMgpD4uB9dkbVPU1IObvM8YYY0yRLMgpD5Pxko1z7fX39SMiF4vIWhFZm28EhzHGGGMsyCkn+Ya5Sb7tqvoDVV2qqktbWlrGvmbGGGNMBbIgpzzsBRrybK8nfwuPMcYYY4ZhQU55WE9O7o2IzAImkZOrY4wxxpjCWJBTHu4FzhaR2qxtF+HN+P3H0lTJGGOMqWwW5JSHW4EEcIeInCkiFwPXAjfaHDnGGGPMyNiyDmXCX9bhFvov63DtcMs6iEg7MHAhlUPTDAxcWKdy2fWUN7ue8mbXU94O1+uZo6rDjryxIMcMICJrC1kTpFLY9ZQ3u57yZtdT3ux6hmbdVcYYY4yZkCzIMcYYY8yEZEGOyecHpa7AKLPrKW92PeXNrqe82fUMwXJyjDHGGDMhWUuOMcYYYyYkC3IM4A1hF5GHRCQmIm+IyHUiEih1vUZCRD4mIprn8clS160QIrJARL4vIs+KSFpEHs5TRkTkKhHZKiJxEXlERE4oQXWHVeD1bMlzv3aUoLpDEpELReS3IrJNRLpE5GkR+WBOmUq6N4VcT0XcGwARuUBEVonIHhHpEZENIvIlEQlnlamk+1PI9VTM/cklIjP9nzsVkZqs7aN2j4KjV11TqURkMvAgsA44H2gFvo0XBH+phFU7VO/AmzU6o61UFSnS0cC5wGogPEiZK4CrgS/gLf1xKfCgiByjquX2AVfI9QD8BLg5633vWFZqhC4FNgP/gDeXx7nAT0SkWVUzda+ke1PI9UBl3BuAJuAPwDfx5htbhjex6jTgM36ZSro/hVwPVM79yfVNoAtvCaNso3ePVNUeh/kDuBJvkdC6rG2XA7HsbZXyAD6Gt3p7TanrMsL6O1mvfwE8nLO/GtgPfDlr2ySgHbi+1PUv9nr87VuAb5W6rgVcS3OebT8BNlfovRnyeirp3gxxjTfgBQhSafdnuOup5PsDnAZ0AJ/P/rwe7Xtk3VUGYCVwv/ZfQuKnQAQ4vTRVOnypqjtMkRVAHfCzrGO6gTvx7mVZKeB6Koaq5puJ9Rlgiv+60u7NcNczEezhYAtiRd2fQWRfT0XyUyFuBq5j4OzGo3qPLMgx4K2A3m+1c1V9Da8lZ3HeIyrDJhFJ+f3Y/7fUlRlFi4E0sDFn+0tU9v36uIj0ish+EfmFiMwpdYUKtAKvqxcmxr3Jvp6Miro3IhIQkaiInApcAvybek0CFXl/hriejIq6P8An8Vps/iXPvlG9R5aTYwAm4zV/5trr76s02/H6c58EAsAHgVtFJKqq3ylpzUbHZKBLB65rtheIikhYVSulTz7jN3g5O68DRwHXAI+KyLGqur+kNRuCiJyBl8f2cX9TRd+bPNcDlXlvuoEq//V/4+V2QOXen8GuByrs/ohIE/BPwIdVNSkiuUVG9R5ZkGMy8k2YJINsL2uqej9wf9ame0WkCviSiNw0QbpPBrtfg+0ra6r6uay3j4rIKuDPwF8D3y1NrYYmInPx8ld+o6o/ytpVkfdmsOupxHuD1xoVxUvU/TLe4sef8vdV4v0Z9Hoq8P7cAKxR1XuGKDNq98iCHANehNyQZ3s9+Vt4KtEvgL8E5lI5o6wGsxeoFZFAzn87DUBMVZMlqteoUdUXRGQDcFKp65KPiDQC9wKvAR/O2lWR92aI6xmg3O8NgKr+yX/5mIjsBv5LRL5Nhd6fwa5HVTflKVu290dEjsZrJXyriGT+5kT953oRSTPK98hycgx4+Tj9+jpFZBZeRvv6vEdUrnL9T60Y6/G64RbkbB+QWzUBlN39EpEocBde8ue7/KTIjIq7N8Ncz1DK7t4MIhMgzKMC708e2dczlHK8PwuBEPAEXjCzl4N5Oa/jJSOP6j2yIMeA9x/c2SJSm7XtIrw5Zv5YmiqNuvfjZfG/WuqKjIJVQCdwYWaD/4fqPLx7WfFE5BhgEfB0qeuSTUSCwM/xPqxXququnCIVdW8KuJ58x5TlvRnCKf7zZirs/gwi+3oGKPP78xjw9pzH1/195+LNmzOq98i6qwzArXgZ+3eIyNeB+XgTTt2YM6y8IojIL/GSjp/D+4/gIv9xSSXk4/i/0Of6b2cCdSJygf/+HlWNicjXgKtFZC8HJ8ty6D8hWFkY7nrwPug+jNea8Abef2xfwus6+dG4VnZ4/4p3LZ8DGkXk5Kx9z6hqTyXdG4a5HuBMKufeICL34U1s+iLeCJ1TgMuA2zNdO5V0f4a7HhF5FxV0f/wpCx7O3ubnggE8qqpd/rbRu0elnhDIHuXxAJYAv8drvdmOl/0eKHW9Rngt/wxswBsCH8f7j+Yjpa5XEfWfi9fUnO8x1y8jwD/iNfHGgUeBE0td95FcD3Ac8BDeZF9JYAfeB/SMUtc9z7VsmWD3ZsjrqaR741/PPwEv4M2iuw+va+ezQCirTCXdnyGvp9LuzyDX+DFyJm8dzXtkq5AbY4wxZkKynBxjjDHGTEgW5BhjjDFmQrIgxxhjjDETkgU5xhhjjJmQLMgxxhhjzIRkQY4xxhhjJiQLcowxFUlErhURHeQx5PpLec6zeyzrmvW1fiEiD4/H1zLG2IzHxpjKth84J8/2V4o4x23AnaNTHWNMObEgxxhTyVKquvpQTqCqr+PNrGqMmWCsu8oYMyGJyFy/6+pDIvJjETkgIrtE5Jqccv26q0QkJCLfEpHXRCQhIm+IyK9EJJxV5gQReUhEYiKyV0T+n4hMzTnvLBG5R0TiIrJFRD4xSD2PEZG7/fodEJGfi8i0YupjjMnPWnKMMRXNX0m7H1VNZb39Jt4ChhcAbwWuEZHdqvovg5zySuD/AFfgrfQ8DW8Ry4D/9VrwFhl8CfgQUAN8DXhARJaqaq+ICPAboBn4G6AH+ArQCGzMqvsC4HFgLfAR/2v8E3CniCxTb92dIetjjBmcBTnGmErWhLcwYT8iMi/r7Yuq+n/91/eLyBTgKhH5N82/Kv0y4Ceq+l9Z236W9foy//lsVe30v97LwBrg/cD/AiuBE4GTVXWNX+ZpYBNZQQ5wDd6iiitVtdcv9xzeysvnAncXUB9jzCCsu8oYU8n2A2/O83gjq8yvco65A5gBHDHIOf8MfExELheR4/xWmWzLgN9lAhwAVX0Sb0XvU7PK7MwEOH6ZV4Gnc851pl8/V0SCfqvUZv9cSwusjzFmEBbkGGMqWUpV1+Z59GaV2ZVzTOb99EHOeT3wL8CngGeBrSLyuaz904GdeY7bidcdBV6XUu7XzVeXZuCLeK1R2Y/5wKwC62OMGYQFOcaYiW7KIO+35yusqj2q+mVVnQscCdwOfFdEzsk6LvecAFOBDv/1jkHK5G7rAL5P/tao6wusjzFmEBbkGGMmuvfmvH8fXqAy7LBxVd0IfB5IAEv8zWuAs0WkNlNORN4MzAUe8zc9BUwVkbdklZkNnJTzJR4CjgGeztMataXA+hhjBmGJx8aYShYUkZPzbN+a9fpoEfk+8Eu80VV/A3xukKRjRORXeLkzzwBxvFFZQeARv8iNwN/hJTF/nYOjq573vwbAPXhdSz8XkS/ija66joHdVdcCTwJ3i8h/ALuBmcA7gR+p6sMF1McYMwgLcowxlaweeCLP9quB//FfXw68Gy8A6cEbon3LEOdcBVwEfAGvtXsd8H5VXQugqu0i8nbg23gjqXrxgpp/yOQCqaqKyHuAHwD/gRfc/DNe8NKc+UKq+rIfpF3vl40A2/BaeDKzNg9ZH2PM4MSbhsEYYyYWEZmLN1LpPFW9q7S1McaUguXkGGOMMWZCsiDHGGOMMROSdVcZY4wxZkKylhxjjDHGTEgW5BhjjDFmQrIgxxhjjDETkgU5xhhjjJmQLMgxxhhjzIRkQY4xxhhjJqT/D2XpfIFobzHuAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do NOT modify the parameter settings.\n",
    "\n",
    "# Experiment parameters\n",
    "experiment_parameters = {\n",
    "    \"num_runs\" : 30,                     # The number of times we run the experiment\n",
    "    \"num_episodes\" : 40,                 # The number of episodes per experiment\n",
    "}\n",
    "\n",
    "# Environment parameters\n",
    "environment_parameters = { \n",
    "    \"discount\": 0.95,\n",
    "}\n",
    "\n",
    "# Agent parameters\n",
    "agent_parameters = {  \n",
    "    \"num_states\" : 54,\n",
    "    \"num_actions\" : 4, \n",
    "    \"epsilon\": 0.1, \n",
    "    \"step_size\" : 0.125,\n",
    "    \"planning_steps\" : [0, 5, 50]       # The list of planning_steps we want to try\n",
    "}\n",
    "\n",
    "current_env = ShortcutMazeEnvironment   # The environment\n",
    "current_agent = DynaQAgent              # The agent\n",
    "\n",
    "run_experiment(current_env, current_agent, environment_parameters, agent_parameters, experiment_parameters)\n",
    "plot_steps_per_episode('results/Dyna-Q_planning_steps.npy')   \n",
    "shutil.make_archive('results', 'zip', 'results');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b78255378e333ad6a4b69eadb1c5bce9",
     "grade": false,
     "grade_id": "cell-e55bf393c9e5a94b",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "What do you notice?\n",
    "\n",
    "As the number of planning steps increases, the number of episodes taken to reach the goal decreases rapidly. Remember that the RNG seed was set the same for all the three values of planning steps, resulting in the same number of steps taken to reach the goal in the first episode. Thereafter, the performance improves. The slowest improvement is when there are $n=0$ planning steps, i.e., for the non-planning Q-learning agent, even though the step size parameter was optimized for it. Note that the grey dotted line shows the minimum number of steps required to reach the goal state under the optimal greedy policy.\n",
    "\n",
    "---\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "38982e501241998792ae2aebe105c47b",
     "grade": false,
     "grade_id": "cell-56f6a9492acc5115",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Experiment(s): Dyna-Q agent in the _changing_ maze environment "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "28e53909e26c756c30000e1a0f0d9b4c",
     "grade": false,
     "grade_id": "cell-64cbd79abcf74fce",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Great! Now let us see how Dyna-Q performs on the version of the maze in which a shorter path opens up after 3000 steps. The rest of the transition and reward dynamics remain the same. \n",
    "\n",
    "<img src=\"./images/shortcut_env_after.png\" alt=\"environment\" width=\"800\"/>\n",
    "\n",
    "Before you proceed, take a moment to think about what you expect to see. Will Dyna-Q find the new, shorter path to the goal? If so, why? If not, why not?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "fd85c37c0082135d539e4160d4e07949",
     "grade": false,
     "grade_id": "cell-8f6730285bc8288e",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "def run_experiment_with_state_visitations(env, agent, env_parameters, agent_parameters, exp_parameters, result_file_name):\n",
    "\n",
    "    # Experiment settings\n",
    "    num_runs = exp_parameters['num_runs']\n",
    "    num_max_steps = exp_parameters['num_max_steps']\n",
    "    planning_steps_all = agent_parameters['planning_steps']\n",
    "\n",
    "    env_info = {\"change_at_n\" : env_parameters[\"change_at_n\"]}                     \n",
    "    agent_info = {\"num_states\" : agent_parameters[\"num_states\"],  \n",
    "                  \"num_actions\" : agent_parameters[\"num_actions\"],\n",
    "                  \"epsilon\": agent_parameters[\"epsilon\"], \n",
    "                  \"discount\": env_parameters[\"discount\"],\n",
    "                  \"step_size\" : agent_parameters[\"step_size\"]}\n",
    "\n",
    "    state_visits_before_change = np.zeros((len(planning_steps_all), num_runs, 54))  # For saving the number of\n",
    "    state_visits_after_change = np.zeros((len(planning_steps_all), num_runs, 54))   #     state-visitations \n",
    "    cum_reward_all = np.zeros((len(planning_steps_all), num_runs, num_max_steps))   # For saving the cumulative reward\n",
    "    log_data = {'planning_steps_all' : planning_steps_all}\n",
    "\n",
    "    for idx, planning_steps in enumerate(planning_steps_all):\n",
    "\n",
    "        print('Planning steps : ', planning_steps)\n",
    "        os.system('sleep 1')          # to prevent tqdm printing out-of-order before the above print()\n",
    "        agent_info[\"planning_steps\"] = planning_steps  # We pass the agent the information it needs. \n",
    "\n",
    "        for run in tqdm(range(num_runs)):\n",
    "\n",
    "            agent_info['random_seed'] = run\n",
    "            agent_info['planning_random_seed'] = run\n",
    "\n",
    "            rl_glue = RLGlue(env, agent)  # Creates a new RLGlue experiment with the env and agent we chose above\n",
    "            rl_glue.rl_init(agent_info, env_info) # We pass RLGlue what it needs to initialize the agent and environment\n",
    "\n",
    "            num_steps = 0\n",
    "            cum_reward = 0\n",
    "\n",
    "            while num_steps < num_max_steps-1 :\n",
    "\n",
    "                state, _ = rl_glue.rl_start()  # We start the experiment. We'll be collecting the \n",
    "                is_terminal = False            # state-visitation counts to visiualize the learned policy\n",
    "                if num_steps < env_parameters[\"change_at_n\"]: \n",
    "                    state_visits_before_change[idx][run][state] += 1\n",
    "                else:\n",
    "                    state_visits_after_change[idx][run][state] += 1\n",
    "\n",
    "                while not is_terminal and num_steps < num_max_steps-1 :\n",
    "                    reward, state, action, is_terminal = rl_glue.rl_step()  \n",
    "                    num_steps += 1\n",
    "                    cum_reward += reward\n",
    "                    cum_reward_all[idx][run][num_steps] = cum_reward\n",
    "                    if num_steps < env_parameters[\"change_at_n\"]:\n",
    "                        state_visits_before_change[idx][run][state] += 1\n",
    "                    else:\n",
    "                        state_visits_after_change[idx][run][state] += 1\n",
    "\n",
    "    log_data['state_visits_before'] = state_visits_before_change\n",
    "    log_data['state_visits_after'] = state_visits_after_change\n",
    "    log_data['cum_reward_all'] = cum_reward_all\n",
    "    np.save(\"results/\" + result_file_name, log_data)\n",
    "\n",
    "def plot_cumulative_reward(file_path, item_key, y_key, y_axis_label, legend_prefix, title):\n",
    "\n",
    "    data_all = np.load(file_path).item()\n",
    "    data_y_all = data_all[y_key]\n",
    "    items = data_all[item_key]\n",
    "\n",
    "    for i, item in enumerate(items):\n",
    "        plt.plot(np.mean(data_y_all[i], axis=0), label=legend_prefix+str(item))\n",
    "\n",
    "    plt.axvline(x=3000, linestyle='--', color='grey', alpha=0.4)\n",
    "    plt.xlabel('Timesteps')\n",
    "    plt.ylabel(y_axis_label, rotation=0, labelpad=60)\n",
    "    plt.legend(loc='upper left')\n",
    "    plt.title(title)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "e463255ee451c8ca255ed3f24dd96bf4",
     "grade": false,
     "grade_id": "cell-7a4965729e7c41f3",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Did you notice that the environment changes after a fixed number of _steps_ and not episodes? \n",
    "\n",
    "This is because the environment is separate from the agent, and the environment changes irrespective of the length of each episode (i.e., the number of environmental interactions per episode) that the agent perceives. And hence we are now plotting the data per step or interaction of the agent and the environment, in order to comfortably see the differences in the behaviours of the agents before and after the environment changes.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "e5a10d7810edcc38ed364530e320e5b7",
     "grade": false,
     "grade_id": "cell-1585cb7119e3b66d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Okay, now we will first plot the cumulative reward obtained by the agent per interaction with the environment, averaged over 10 runs of the experiment on this changing world. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [00:06<00:00,  1.60it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  10\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [00:10<00:00,  1.09s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  50\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [00:46<00:00,  4.68s/it]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do NOT modify the parameter settings.\n",
    "\n",
    "# Experiment parameters\n",
    "experiment_parameters = {\n",
    "    \"num_runs\" : 10,                     # The number of times we run the experiment\n",
    "    \"num_max_steps\" : 6000,              # The number of steps per experiment\n",
    "}\n",
    "\n",
    "# Environment parameters\n",
    "environment_parameters = { \n",
    "    \"discount\": 0.95,\n",
    "    \"change_at_n\": 3000\n",
    "}\n",
    "\n",
    "# Agent parameters\n",
    "agent_parameters = {  \n",
    "    \"num_states\" : 54,\n",
    "    \"num_actions\" : 4, \n",
    "    \"epsilon\": 0.1, \n",
    "    \"step_size\" : 0.125,\n",
    "    \"planning_steps\" : [5, 10, 50]      # The list of planning_steps we want to try\n",
    "}\n",
    "\n",
    "current_env = ShortcutMazeEnvironment   # The environment\n",
    "current_agent = DynaQAgent              # The agent\n",
    "\n",
    "run_experiment_with_state_visitations(current_env, current_agent, environment_parameters, agent_parameters, experiment_parameters, \"Dyna-Q_shortcut_steps\")    \n",
    "plot_cumulative_reward('results/Dyna-Q_shortcut_steps.npy', 'planning_steps_all', 'cum_reward_all', 'Cumulative\\nreward', 'Planning steps = ', 'Dyna-Q : Varying planning_steps')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "2ce0809c6896af47bf2391c654533a42",
     "grade": false,
     "grade_id": "cell-bdab2f4622d3890b",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "We observe that the slope of the curves is almost constant. If the agent had discovered the shortcut and begun using it, we would expect to see an increase in the slope of the curves towards the later stages of training. This is because the agent can get to the goal state faster and get the positive reward. Note that the timestep at which the shortcut opens up is marked by the grey dotted line.\n",
    "\n",
    "Note that this trend is constant across the increasing number of planning steps.\n",
    "\n",
    "Now let's check the heatmap of the state visitations of the agent with `planning_steps=10` during training, before and after the shortcut opens up after 3000 timesteps."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "2ebb3b3a6fa7c60ee1f35412d3b35e74",
     "grade": false,
     "grade_id": "cell-36a0d9e197e4f128",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "def plot_state_visitations(file_path, plot_titles, idx):\n",
    "\n",
    "    data = np.load(file_path).item()\n",
    "    data_keys = [\"state_visits_before\", \"state_visits_after\"]\n",
    "    positions = [211,212]\n",
    "    titles = plot_titles\n",
    "    wall_ends = [None,-1]\n",
    "\n",
    "    for i in range(2):\n",
    "\n",
    "        state_visits = data[data_keys[i]][idx]\n",
    "        average_state_visits = np.mean(state_visits, axis=0)\n",
    "        grid_state_visits = np.rot90(average_state_visits.reshape((6,9)).T)\n",
    "        grid_state_visits[2,1:wall_ends[i]] = np.nan # walls\n",
    "        #print(average_state_visits.reshape((6,9)))\n",
    "        plt.subplot(positions[i])\n",
    "        plt.pcolormesh(grid_state_visits, edgecolors='gray', linewidth=1, cmap='viridis')\n",
    "        plt.text(3+0.5, 0+0.5, 'S', horizontalalignment='center', verticalalignment='center')\n",
    "        plt.text(8+0.5, 5+0.5, 'G', horizontalalignment='center', verticalalignment='center')\n",
    "        plt.title(titles[i])\n",
    "        plt.axis('off')\n",
    "        cm = plt.get_cmap()\n",
    "        cm.set_bad('gray')\n",
    "\n",
    "    plt.subplots_adjust(bottom=0.0, right=0.7, top=1.0)\n",
    "    cax = plt.axes([1., 0.0, 0.075, 1.])\n",
    "    cbar = plt.colorbar(cax=cax)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "plot_state_visitations(\"results/Dyna-Q_shortcut_steps.npy\", ['Dyna-Q : State visitations before the env changes', 'Dyna-Q : State visitations after the env changes'], 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "15aded4269ccf83bd3fa9b4ca9be353c",
     "grade": false,
     "grade_id": "cell-61bd2cfdba9cc49d",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "What do you observe?\n",
    "\n",
    "The state visitation map looks almost the same before and after the shortcut opens. This means that the Dyna-Q agent hasn't quite discovered and started exploiting the new shortcut.\n",
    "\n",
    "Now let's try increasing the exploration parameter $\\epsilon$ to see if it helps the Dyna-Q agent discover the shortcut. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "c97f95a59de3b9000e564c23dd1e8a6e",
     "grade": false,
     "grade_id": "cell-c9eab4ed4cf50870",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "def run_experiment_only_cumulative_reward(env, agent, env_parameters, agent_parameters, exp_parameters):\n",
    "\n",
    "    # Experiment settings\n",
    "    num_runs = exp_parameters['num_runs']\n",
    "    num_max_steps = exp_parameters['num_max_steps']\n",
    "    epsilons = agent_parameters['epsilons']\n",
    "\n",
    "    env_info = {\"change_at_n\" : env_parameters[\"change_at_n\"]}                     \n",
    "    agent_info = {\"num_states\" : agent_parameters[\"num_states\"],  \n",
    "                  \"num_actions\" : agent_parameters[\"num_actions\"],\n",
    "                  \"planning_steps\": agent_parameters[\"planning_steps\"], \n",
    "                  \"discount\": env_parameters[\"discount\"],\n",
    "                  \"step_size\" : agent_parameters[\"step_size\"]}\n",
    "\n",
    "    log_data = {'epsilons' : epsilons} \n",
    "    cum_reward_all = np.zeros((len(epsilons), num_runs, num_max_steps))\n",
    "\n",
    "    for eps_idx, epsilon in enumerate(epsilons):\n",
    "\n",
    "        print('Agent : Dyna-Q, epsilon : %f' % epsilon)\n",
    "        os.system('sleep 1')          # to prevent tqdm printing out-of-order before the above print()\n",
    "        agent_info[\"epsilon\"] = epsilon\n",
    "\n",
    "        for run in tqdm(range(num_runs)):\n",
    "\n",
    "            agent_info['random_seed'] = run\n",
    "            agent_info['planning_random_seed'] = run\n",
    "\n",
    "            rl_glue = RLGlue(env, agent)  # Creates a new RLGlue experiment with the env and agent we chose above\n",
    "            rl_glue.rl_init(agent_info, env_info) # We pass RLGlue what it needs to initialize the agent and environment\n",
    "\n",
    "            num_steps = 0\n",
    "            cum_reward = 0\n",
    "\n",
    "            while num_steps < num_max_steps-1 :\n",
    "\n",
    "                rl_glue.rl_start()  # We start the experiment\n",
    "                is_terminal = False\n",
    "\n",
    "                while not is_terminal and num_steps < num_max_steps-1 :\n",
    "                    reward, _, action, is_terminal = rl_glue.rl_step()  # The environment and agent take a step and return\n",
    "                    # the reward, and action taken.\n",
    "                    num_steps += 1\n",
    "                    cum_reward += reward\n",
    "                    cum_reward_all[eps_idx][run][num_steps] = cum_reward\n",
    "\n",
    "    log_data['cum_reward_all'] = cum_reward_all\n",
    "    np.save(\"results/Dyna-Q_epsilons\", log_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Agent : Dyna-Q, epsilon : 0.100000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:32<00:00,  1.10s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Agent : Dyna-Q, epsilon : 0.200000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:32<00:00,  1.09s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Agent : Dyna-Q, epsilon : 0.400000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:32<00:00,  1.09s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Agent : Dyna-Q, epsilon : 0.800000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [00:32<00:00,  1.08s/it]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do NOT modify the parameter settings.\n",
    "\n",
    "# Experiment parameters\n",
    "experiment_parameters = {\n",
    "    \"num_runs\" : 30,                     # The number of times we run the experiment\n",
    "    \"num_max_steps\" : 6000,              # The number of steps per experiment\n",
    "}\n",
    "\n",
    "# Environment parameters\n",
    "environment_parameters = { \n",
    "    \"discount\": 0.95,\n",
    "    \"change_at_n\": 3000\n",
    "}\n",
    "\n",
    "# Agent parameters\n",
    "agent_parameters = {  \n",
    "    \"num_states\" : 54,\n",
    "    \"num_actions\" : 4, \n",
    "    \"step_size\" : 0.125,\n",
    "    \"planning_steps\" : 10,\n",
    "    \"epsilons\": [0.1, 0.2, 0.4, 0.8]    # The list of epsilons we want to try\n",
    "}\n",
    "\n",
    "current_env = ShortcutMazeEnvironment   # The environment\n",
    "current_agent = DynaQAgent              # The agent\n",
    "\n",
    "run_experiment_only_cumulative_reward(current_env, current_agent, environment_parameters, agent_parameters, experiment_parameters)\n",
    "plot_cumulative_reward('results/Dyna-Q_epsilons.npy', 'epsilons', 'cum_reward_all', 'Cumulative\\nreward', r'$\\epsilon$ = ', r'Dyna-Q : Varying $\\epsilon$')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "7587c4a396d64d011ff5d8cf0f755f43",
     "grade": false,
     "grade_id": "cell-75b928a3930343ef",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "What do you observe?\n",
    "\n",
    "Increasing the exploration via the $\\epsilon$-greedy strategy does not seem to be helping. In fact, the agent's cumulative reward decreases because it is spending more and more time trying out the exploratory actions.\n",
    "\n",
    "Can we do better...? "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "fea0fa31931e764395600778cacbde8d",
     "grade": false,
     "grade_id": "cell-53c7b261289030c7",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "## Section 2: Dyna-Q+"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "c201b6bae38cb088c3c3cbc51810c914",
     "grade": false,
     "grade_id": "cell-1ed17a58ff98db6f",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "The motivation behind Dyna-Q+ is to give a bonus reward for actions that haven't been tried for a long time, since there is a greater chance that the dynamics for that actions might have changed.\n",
    "\n",
    "In particular, if the modeled reward for a transition is $r$, and the transition has not been tried in $\\tau(s,a)$ time steps, then planning updates are done as if that transition produced a reward of $r + \\kappa \\sqrt{ \\tau(s,a)}$, for some small $\\kappa$. \n",
    "\n",
    "Let's implement that!\n",
    "\n",
    "Based on your `DynaQAgent`, create a new class `DynaQPlusAgent` to implement the aforementioned exploration heuristic. Additionally :\n",
    "1. actions that had never been tried before from a state should now be allowed to be considered in the planning step,\n",
    "2. and the initial model for such actions is that they lead back to the same state with a reward of zero.\n",
    "\n",
    "At this point, you might want to refer to the video lectures and [Section 8.3](http://www.incompleteideas.net/book/RLbook2018.pdf#page=188) of the RL textbook for a refresher on Dyna-Q+."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "ebbfc778eab63bdff736bc478ebc5928",
     "grade": false,
     "grade_id": "cell-ede9dc6883c45c67",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "As usual, let's break this down in pieces and do it one-by-one.\n",
    "\n",
    "First of all, check out the `agent_init` method below. In particular, pay attention to the attributes which are new to `DynaQPlusAgent`– state-visitation counts $\\tau$ and the scaling parameter $\\kappa$ – because you shall be using them later. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "53479b7ba60db3596b74755d1319b574",
     "grade": false,
     "grade_id": "cell-45b5c95ae385f669",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "class DynaQPlusAgent(BaseAgent):\n",
    "    \n",
    "    def agent_init(self, agent_info):\n",
    "        \"\"\"Setup for the agent called when the experiment first starts.\n",
    "\n",
    "        Args:\n",
    "            agent_init_info (dict), the parameters used to initialize the agent. The dictionary contains:\n",
    "            {\n",
    "                num_states (int): The number of states,\n",
    "                num_actions (int): The number of actions,\n",
    "                epsilon (float): The parameter for epsilon-greedy exploration,\n",
    "                step_size (float): The step-size,\n",
    "                discount (float): The discount factor,\n",
    "                planning_steps (int): The number of planning steps per environmental interaction\n",
    "                kappa (float): The scaling factor for the reward bonus\n",
    "\n",
    "                random_seed (int): the seed for the RNG used in epsilon-greedy\n",
    "                planning_random_seed (int): the seed for the RNG used in the planner\n",
    "            }\n",
    "        \"\"\"\n",
    "\n",
    "        # First, we get the relevant information from agent_info \n",
    "        # Note: we use np.random.RandomState(seed) to set the two different RNGs\n",
    "        # for the planner and the rest of the code\n",
    "        try:\n",
    "            self.num_states = agent_info[\"num_states\"]\n",
    "            self.num_actions = agent_info[\"num_actions\"]\n",
    "        except:\n",
    "            print(\"You need to pass both 'num_states' and 'num_actions' \\\n",
    "                   in agent_info to initialize the action-value table\")\n",
    "        self.gamma = agent_info.get(\"discount\", 0.95)\n",
    "        self.step_size = agent_info.get(\"step_size\", 0.1)\n",
    "        self.epsilon = agent_info.get(\"epsilon\", 0.1)\n",
    "        self.planning_steps = agent_info.get(\"planning_steps\", 10)\n",
    "        self.kappa = agent_info.get(\"kappa\", 0.001)\n",
    "\n",
    "        self.rand_generator = np.random.RandomState(agent_info.get('random_seed', 42))\n",
    "        self.planning_rand_generator = np.random.RandomState(agent_info.get('planning_random_seed', 42))\n",
    "\n",
    "        # Next, we initialize the attributes required by the agent, e.g., q_values, model, tau, etc.\n",
    "        # The visitation-counts can be stored as a table as well, like the action values \n",
    "        self.q_values = np.zeros((self.num_states, self.num_actions))\n",
    "        self.tau = np.zeros((self.num_states, self.num_actions))\n",
    "        self.actions = list(range(self.num_actions))\n",
    "        self.past_action = -1\n",
    "        self.past_state = -1\n",
    "        self.model = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "ae86189d377dcbeb226bd8f01839be62",
     "grade": false,
     "grade_id": "cell-38c00ecba461bf92",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Now first up, implement the `update_model` method. Note that this is different from Dyna-Q in the aforementioned way.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "977dc282839bdb10b454c2ff698b58e6",
     "grade": false,
     "grade_id": "cell-b65a5bb0b37ceb84",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQPlusAgent\n",
    "\n",
    "# [GRADED]\n",
    "\n",
    "def update_model(self, past_state, past_action, state, reward):\n",
    "    \"\"\"updates the model \n",
    "\n",
    "    Args:\n",
    "        past_state  (int): s\n",
    "        past_action (int): a\n",
    "        state       (int): s'\n",
    "        reward      (int): r\n",
    "    Returns:\n",
    "        Nothing\n",
    "    \"\"\"\n",
    "\n",
    "    # Recall that when adding a state-action to the model, if the agent is visiting the state\n",
    "    #    for the first time, then the remaining actions need to be added to the model as well\n",
    "    #    with zero reward and a transition into itself. Something like:\n",
    "    ##   for action in self.actions:\n",
    "    ##       if action != past_action:\n",
    "    ##           self.model[past_state][action] = (past_state, 0)  \n",
    "    #\n",
    "    # Note: do *not* update the visitation-counts here. We will do that in `agent_step`.\n",
    "    #\n",
    "    # (3 lines)\n",
    "\n",
    "    if past_state not in self.model:\n",
    "        self.model[past_state] = {past_action : (state, reward)}\n",
    "        ### START CODE HERE ###\n",
    "        for action in self.actions:\n",
    "            if action != past_action:\n",
    "                self.model[past_state][action] = (past_state, 0)\n",
    "        \n",
    "        ### END CODE HERE ###\n",
    "    else:\n",
    "        self.model[past_state][past_action] = (state, reward)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b319274d17d4f236253245cbafc2f2c9",
     "grade": false,
     "grade_id": "cell-817a09952176290c",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `update_model()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b51603111ba2020112cbdcc427c225b0",
     "grade": true,
     "grade_id": "DynaQPlus_update_model",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \n",
      " {0: {2: (0, 1), 0: (0, 0), 1: (0, 0), 3: (1, 2)}, 2: {0: (1, 1), 1: (2, 0), 2: (2, 0), 3: (2, 0)}}\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for update_model() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQPlusAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "test_agent.update_model(0,2,0,1)\n",
    "test_agent.update_model(2,0,1,1)\n",
    "test_agent.update_model(0,3,1,2)\n",
    "test_agent.tau[0][0] += 1\n",
    "print(\"Model: \\n\", test_agent.model)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "d5fac20afac86a10733c1eff19544eec",
     "grade": false,
     "grade_id": "cell-7d4bca62495646a5",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Model: \n",
    " {0: {2: (0, 1), 0: (0, 0), 1: (0, 0), 3: (1, 2)}, 2: {0: (1, 1), 1: (2, 0), 2: (2, 0), 3: (2, 0)}}\n",
    "```\n",
    "Note that the actions that were not taken from a state are also added to the model, with a loop back into the same state with a reward of 0."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "a7bc69509a63b874bea41e9e1dacddeb",
     "grade": false,
     "grade_id": "cell-d16ba2244f70cccc",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Next, you will implement the `planning_step()` method. This will be very similar to the one you implemented in `DynaQAgent`, but here you will be adding the exploration bonus to the reward in the simulated transition."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "0527e2f3bdd38392222bcaab60b86473",
     "grade": false,
     "grade_id": "cell-850b98235b2087aa",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQPlusAgent\n",
    "\n",
    "# [GRADED]\n",
    "\n",
    "def planning_step(self):\n",
    "    \"\"\"performs planning, i.e. indirect RL.\n",
    "\n",
    "    Args:\n",
    "        None\n",
    "    Returns:\n",
    "        Nothing\n",
    "    \"\"\"\n",
    "    \n",
    "    # The indirect RL step:\n",
    "    # - Choose a state and action from the set of experiences that are stored in the model. (~2 lines)\n",
    "    # - Query the model with this state-action pair for the predicted next state and reward.(~1 line)\n",
    "    # - **Add the bonus to the reward** (~1 line)\n",
    "    # - Update the action values with this simulated experience.                            (2~4 lines)\n",
    "    # - Repeat for the required number of planning steps.\n",
    "    #\n",
    "    # Note that the update equation is different for terminal and non-terminal transitions. \n",
    "    # To differentiate between a terminal and a non-terminal next state, assume that the model stores\n",
    "    # the terminal state as a dummy state like -1\n",
    "    #\n",
    "    # Important: remember you have a random number generator 'planning_rand_generator' as \n",
    "    #     a part of the class which you need to use as self.planning_rand_generator.choice()\n",
    "    #     For the sake of reproducibility and grading, *do not* use anything else like \n",
    "    #     np.random.choice() for performing search control.\n",
    "\n",
    "    ### START CODE HERE ###\n",
    "    for i in range(self.planning_steps):\n",
    "        \n",
    "        s = self.planning_rand_generator.choice(list(self.model.keys()))\n",
    "        a = self.planning_rand_generator.choice(list(self.model[s].keys()))\n",
    "\n",
    "        s_new, r = self.model[s][a]\n",
    "        if s_new != -1:\n",
    "            target = r + self.kappa*np.sqrt(self.tau[s,a])+ self.gamma*np.max(self.q_values[s_new])\n",
    "        else:\n",
    "            target = r + self.kappa*np.sqrt(self.tau[s,a])\n",
    "\n",
    "        self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "\n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "d62d53a3b16a0a7fa4842f5775c442c2",
     "grade": false,
     "grade_id": "cell-f03c6dd8052fd06c",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `planning_step()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "cdcaeef389cd61190d8c59f094144fbf",
     "grade": true,
     "grade_id": "DynaQPlus_planning_step",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \n",
      " {0: {1: (-1, 1), 0: (0, 0), 2: (1, 1), 3: (0, 0)}, 2: {0: (1, 1), 1: (2, 0), 2: (2, 0), 3: (2, 0)}}\n",
      "Action-value estimates: \n",
      " [[0.         0.10014142 0.         0.        ]\n",
      " [0.         0.         0.         0.        ]\n",
      " [0.         0.00036373 0.         0.00017321]]\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for planning_step() ##\n",
    "\n",
    "actions = []\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0, \n",
    "              \"kappa\": 0.001,\n",
    "              \"planning_steps\": 4,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 1}\n",
    "test_agent = DynaQPlusAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "test_agent.update_model(0,1,-1,1)\n",
    "test_agent.tau += 1; test_agent.tau[0][1] = 0\n",
    "test_agent.update_model(0,2,1,1)\n",
    "test_agent.tau += 1; test_agent.tau[0][2] = 0    # Note that these counts are manually updated \n",
    "test_agent.update_model(2,0,1,1)                 #     as we'll code them in `agent_step'  \n",
    "test_agent.tau += 1; test_agent.tau[2][0] = 0    #     which hasn't been implemented yet.\n",
    "\n",
    "test_agent.planning_step()\n",
    "\n",
    "print(\"Model: \\n\", test_agent.model)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "bc713c424acb265ebef08b7c5d2321e8",
     "grade": false,
     "grade_id": "cell-c624d442e2ae7d30",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Model: \n",
    " {0: {1: (-1, 1), 0: (0, 0), 2: (1, 1), 3: (0, 0)}, 2: {0: (1, 1), 1: (2, 0), 2: (2, 0), 3: (2, 0)}}\n",
    "Action-value estimates: \n",
    " [[0.         0.10014142 0.         0.        ]\n",
    " [0.         0.         0.         0.        ]\n",
    " [0.         0.00036373 0.         0.00017321]]\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "45628d99c845d3b4f280c006e697799d",
     "grade": false,
     "grade_id": "cell-92d49553185d7c50",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Again, before you move on to implement the rest of the agent methods, here are the couple of helper functions that you've used in the previous assessments for choosing an action using an $\\epsilon$-greedy policy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "4ae83584fd55c126c09c1c43173dcbaf",
     "grade": false,
     "grade_id": "cell-c31cab304f2230ae",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQPlusAgent\n",
    "\n",
    "# Do not modify this cell!\n",
    "\n",
    "def argmax(self, q_values):\n",
    "    \"\"\"argmax with random tie-breaking\n",
    "    Args:\n",
    "        q_values (Numpy array): the array of action values\n",
    "    Returns:\n",
    "        action (int): an action with the highest value\n",
    "    \"\"\"\n",
    "    top = float(\"-inf\")\n",
    "    ties = []\n",
    "\n",
    "    for i in range(len(q_values)):\n",
    "        if q_values[i] > top:\n",
    "            top = q_values[i]\n",
    "            ties = []\n",
    "\n",
    "        if q_values[i] == top:\n",
    "            ties.append(i)\n",
    "\n",
    "    return self.rand_generator.choice(ties)\n",
    "\n",
    "def choose_action_egreedy(self, state):\n",
    "    \"\"\"returns an action using an epsilon-greedy policy w.r.t. the current action-value function.\n",
    "\n",
    "    Important: assume you have a random number generator 'rand_generator' as a part of the class\n",
    "                which you can use as self.rand_generator.choice() or self.rand_generator.rand()\n",
    "\n",
    "    Args:\n",
    "        state (List): coordinates of the agent (two elements)\n",
    "    Returns:\n",
    "        The action taken w.r.t. the aforementioned epsilon-greedy policy\n",
    "    \"\"\"\n",
    "\n",
    "    if self.rand_generator.rand() < self.epsilon:\n",
    "        action = self.rand_generator.choice(self.actions)\n",
    "    else:\n",
    "        values = self.q_values[state]\n",
    "        action = self.argmax(values)\n",
    "\n",
    "    return action"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "ff01d8dc7e39cfc84ff1e0799736d5a3",
     "grade": false,
     "grade_id": "cell-2af006f875c70cf7",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Now implement the rest of the agent-related methods, namely `agent_start`, `agent_step`, and `agent_end`. Again, these will be very similar to the ones in the `DynaQAgent`, but you will have to think of a way to update the counts since the last visit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "checksum": "2dff5e0b57e00801566b5b83956a18d6",
     "grade": false,
     "grade_id": "cell-34cb21ba9a8f931c",
     "locked": false,
     "schema_version": 1,
     "solution": true
    }
   },
   "outputs": [],
   "source": [
    "%%add_to DynaQPlusAgent\n",
    "\n",
    "# [GRADED]\n",
    "    \n",
    "def agent_start(self, state):\n",
    "    \"\"\"The first method called when the experiment starts, called after\n",
    "    the environment starts.\n",
    "    Args:\n",
    "        state (Numpy array): the state from the\n",
    "            environment's env_start function.\n",
    "    Returns:\n",
    "        (int) The first action the agent takes.\n",
    "    \"\"\"\n",
    "    \n",
    "    # given the state, select the action using self.choose_action_egreedy(), \n",
    "    # and save current state and action (~2 lines)\n",
    "    ### self.past_state = ?\n",
    "    ### self.past_action = ?\n",
    "    # Note that the last-visit counts are not updated here.\n",
    "    \n",
    "    ### START CODE HERE ###\n",
    "    self.past_action = self.choose_action_egreedy(state)\n",
    "    self.past_state = state\n",
    "    \n",
    "    ### END CODE HERE ###\n",
    "    \n",
    "    return self.past_action\n",
    "\n",
    "def agent_step(self, reward, state):\n",
    "    \"\"\"A step taken by the agent.\n",
    "    Args:\n",
    "        reward (float): the reward received for taking the last action taken\n",
    "        state (Numpy array): the state from the\n",
    "            environment's step based on where the agent ended up after the\n",
    "            last step\n",
    "    Returns:\n",
    "        (int) The action the agent is taking.\n",
    "    \"\"\"  \n",
    "    \n",
    "    # Update the last-visited counts (~2 lines)\n",
    "    # - Direct-RL step (1~3 lines)\n",
    "    # - Model Update step (~1 line)\n",
    "    # - `planning_step` (~1 line)\n",
    "    # - Action Selection step (~1 line)\n",
    "    # Save the current state and action before returning the action to be performed. (~2 lines)\n",
    "    \n",
    "    ### START CODE HERE ###\n",
    "    \n",
    "    # update the tau\n",
    "    self.tau += 1\n",
    "    s, a = self.past_state, self.past_action\n",
    "    self.tau[s, a] = 0\n",
    "    \n",
    "    target = reward + self.gamma*np.max(self.q_values[state])\n",
    "    self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "    \n",
    "    self.update_model(s,a, state, reward)\n",
    "    self.planning_step()\n",
    "    \n",
    "    action = self.choose_action_egreedy(state)\n",
    "    self.past_state = state\n",
    "    self.past_action = action\n",
    "    \n",
    "    \n",
    "    \n",
    "    ### END CODE HERE ###\n",
    "    \n",
    "    return self.past_action\n",
    "\n",
    "def agent_end(self, reward):\n",
    "    \"\"\"Called when the agent terminates.\n",
    "    Args:\n",
    "        reward (float): the reward the agent received for entering the\n",
    "            terminal state.\n",
    "    \"\"\"\n",
    "    # Again, add the same components you added in agent_step to augment Dyna-Q into Dyna-Q+\n",
    "    \n",
    "    ### START CODE HERE ###\n",
    "    self.tau += 1\n",
    "    s,a = self.past_state, self.past_action\n",
    "    self.tau[s, a] = 0\n",
    "    \n",
    "    target = reward\n",
    "    self.q_values[s, a] = self.q_values[s,a] + self.step_size*(target - self.q_values[s, a])\n",
    "    \n",
    "    self.update_model(s,a,-1,reward)\n",
    "    self.planning_step()\n",
    "    \n",
    "    \n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "0d0186afc16559c8d05fff29e5b91b50",
     "grade": false,
     "grade_id": "cell-da231fa8a614788e",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Let's test these methods one-by-one."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "723356966ffc5fbeb16a6cd981071bbe",
     "grade": false,
     "grade_id": "cell-8db85fa89415ea0e",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_start()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "703e7137c1d55bd3649a2cabe18f6738",
     "grade": true,
     "grade_id": "DynaPlus_agent_start",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Action: 1\n",
      "Timesteps since last visit: \n",
      " [[0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]]\n",
      "Action-value estimates: \n",
      " [[0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]]\n",
      "Model: \n",
      " {}\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_start() ##\n",
    "\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0,\n",
    "              \"kappa\": 0.001,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQPlusAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "action = test_agent.agent_start(0) # state\n",
    "print(\"Action:\", action)\n",
    "print(\"Timesteps since last visit: \\n\", test_agent.tau)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n",
    "print(\"Model: \\n\", test_agent.model)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "ea8c3a78e11dd96c73d1d02933e0ec64",
     "grade": false,
     "grade_id": "cell-f6fb327707c1855c",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Action: 1\n",
    "Timesteps since last visit: \n",
    " [[0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]]\n",
    "Action-value estimates: \n",
    " [[0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]\n",
    " [0. 0. 0. 0.]]\n",
    "Model: \n",
    " {}\n",
    "```\n",
    "Remember the last-visit counts are not updated in `agent_start()`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "28714342c4f7fec008e01c525e98d2a6",
     "grade": false,
     "grade_id": "cell-be8fc718581879ad",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_step()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "1ebd676152a198dc5e4e009198c36aee",
     "grade": true,
     "grade_id": "DynaQPlus_agent_step",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Actions: [1, 3, 1]\n",
      "Timesteps since last visit: \n",
      " [[2. 1. 2. 2.]\n",
      " [2. 2. 2. 2.]\n",
      " [2. 2. 2. 0.]]\n",
      "Action-value estimates: \n",
      " [[1.91000000e-02 2.71000000e-01 0.00000000e+00 1.91000000e-02]\n",
      " [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n",
      " [0.00000000e+00 1.83847763e-04 4.24264069e-04 0.00000000e+00]]\n",
      "Model: \n",
      " {0: {1: (2, 1), 0: (0, 0), 2: (0, 0), 3: (0, 0)}, 2: {3: (1, 0), 0: (2, 0), 1: (2, 0), 2: (2, 0)}}\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_step() ##\n",
    "\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0,\n",
    "              \"kappa\": 0.001,\n",
    "              \"planning_steps\": 4,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQPlusAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "actions = []\n",
    "actions.append(test_agent.agent_start(0))    # state\n",
    "actions.append(test_agent.agent_step(1,2))   # (reward, state)\n",
    "actions.append(test_agent.agent_step(0,1))   # (reward, state)\n",
    "print(\"Actions:\", actions)\n",
    "print(\"Timesteps since last visit: \\n\", test_agent.tau)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n",
    "print(\"Model: \\n\", test_agent.model)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "b7f7f472dbae4f04ab045f9070443158",
     "grade": false,
     "grade_id": "cell-6cd0bcf30529fcca",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Actions: [1, 3, 1]\n",
    "Timesteps since last visit: \n",
    " [[2. 1. 2. 2.]\n",
    " [2. 2. 2. 2.]\n",
    " [2. 2. 2. 0.]]\n",
    "Action-value estimates: \n",
    " [[1.91000000e-02 2.71000000e-01 0.00000000e+00 1.91000000e-02]\n",
    " [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n",
    " [0.00000000e+00 1.83847763e-04 4.24264069e-04 0.00000000e+00]]\n",
    "Model: \n",
    " {0: {1: (2, 1), 0: (0, 0), 2: (0, 0), 3: (0, 0)}, 2: {3: (1, 0), 0: (2, 0), 1: (2, 0), 2: (2, 0)}}\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "069707871b3203dcaf81c9081726455b",
     "grade": false,
     "grade_id": "cell-ffbeb161866707da",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Test `agent_end()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "cfdf00092d97d6e9ac98447202a6d292",
     "grade": true,
     "grade_id": "DynaQPlus_agent_end",
     "locked": true,
     "points": 5,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Actions: [1, 3, 1]\n",
      "Timesteps since last visit: \n",
      " [[3. 2. 3. 3.]\n",
      " [3. 0. 3. 3.]\n",
      " [3. 3. 3. 1.]]\n",
      "Action-value estimates: \n",
      " [[1.91000000e-02 3.44083848e-01 0.00000000e+00 4.44632051e-02]\n",
      " [1.91732051e-02 1.90000000e-01 0.00000000e+00 0.00000000e+00]\n",
      " [0.00000000e+00 1.83847763e-04 4.24264069e-04 0.00000000e+00]]\n",
      "Model: \n",
      " {0: {1: (2, 1), 0: (0, 0), 2: (0, 0), 3: (0, 0)}, 2: {3: (1, 0), 0: (2, 0), 1: (2, 0), 2: (2, 0)}, 1: {1: (-1, 1), 0: (1, 0), 2: (1, 0), 3: (1, 0)}}\n"
     ]
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "## Test code for agent_end() ##\n",
    "\n",
    "agent_info = {\"num_actions\": 4, \n",
    "              \"num_states\": 3, \n",
    "              \"epsilon\": 0.1, \n",
    "              \"step_size\": 0.1, \n",
    "              \"discount\": 1.0,\n",
    "              \"kappa\": 0.001,\n",
    "              \"planning_steps\": 4,\n",
    "              \"random_seed\": 0,\n",
    "              \"planning_random_seed\": 0}\n",
    "test_agent = DynaQPlusAgent()\n",
    "test_agent.agent_init(agent_info)\n",
    "actions = []\n",
    "actions.append(test_agent.agent_start(0))\n",
    "actions.append(test_agent.agent_step(1,2))\n",
    "actions.append(test_agent.agent_step(0,1))\n",
    "test_agent.agent_end(1)\n",
    "print(\"Actions:\", actions)\n",
    "print(\"Timesteps since last visit: \\n\", test_agent.tau)\n",
    "print(\"Action-value estimates: \\n\", test_agent.q_values)\n",
    "print(\"Model: \\n\", test_agent.model)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "c008b44213589da78abaf90a07ebb93e",
     "grade": false,
     "grade_id": "cell-e4831f4d1cf10b12",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Expected output:\n",
    "```\n",
    "Actions: [1, 3, 1]\n",
    "Timesteps since last visit: \n",
    " [[3. 2. 3. 3.]\n",
    " [3. 0. 3. 3.]\n",
    " [3. 3. 3. 1.]]\n",
    "Action-value estimates: \n",
    " [[1.91000000e-02 3.44083848e-01 0.00000000e+00 4.44632051e-02]\n",
    " [1.91732051e-02 1.90000000e-01 0.00000000e+00 0.00000000e+00]\n",
    " [0.00000000e+00 1.83847763e-04 4.24264069e-04 0.00000000e+00]]\n",
    "Model: \n",
    " {0: {1: (2, 1), 0: (0, 0), 2: (0, 0), 3: (0, 0)}, 2: {3: (1, 0), 0: (2, 0), 1: (2, 0), 2: (2, 0)}, 1: {1: (-1, 1), 0: (1, 0), 2: (1, 0), 3: (1, 0)}}\n",
    " ```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "334f1ceca4ab090a3e1ec653e3b496c2",
     "grade": false,
     "grade_id": "cell-839b7e5d8b7c439f",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "### Experiment: Dyna-Q+ agent in the _changing_ environment\n",
    "\n",
    "Okay, now we're ready to test our Dyna-Q+ agent on the Shortcut Maze. As usual, we will average the results over 30 independent runs of the experiment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Planning steps :  50\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 30/30 [02:37<00:00,  5.27s/it]\n"
     ]
    }
   ],
   "source": [
    "# Do NOT modify the parameter settings.\n",
    "\n",
    "# Experiment parameters\n",
    "experiment_parameters = {\n",
    "    \"num_runs\" : 30,                     # The number of times we run the experiment\n",
    "    \"num_max_steps\" : 6000,              # The number of steps per experiment\n",
    "}\n",
    "\n",
    "# Environment parameters\n",
    "environment_parameters = { \n",
    "    \"discount\": 0.95,\n",
    "    \"change_at_n\": 3000\n",
    "}\n",
    "\n",
    "# Agent parameters\n",
    "agent_parameters = {  \n",
    "    \"num_states\" : 54,\n",
    "    \"num_actions\" : 4, \n",
    "    \"epsilon\": 0.1, \n",
    "    \"step_size\" : 0.5,\n",
    "    \"planning_steps\" : [50]      \n",
    "}\n",
    "\n",
    "current_env = ShortcutMazeEnvironment   # The environment\n",
    "current_agent = DynaQPlusAgent          # The agent\n",
    "\n",
    "run_experiment_with_state_visitations(current_env, current_agent, environment_parameters, agent_parameters, experiment_parameters, \"Dyna-Q+\")\n",
    "shutil.make_archive('results', 'zip', 'results');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "0aae91605b0be56ef43e821b1719bfbf",
     "grade": false,
     "grade_id": "cell-d1f8fd21d4357f1a",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Let's compare the Dyna-Q and Dyna-Q+ agents with `planning_steps=50` each."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "d35e2a4111ca0d5f4baf83885e537139",
     "grade": false,
     "grade_id": "cell-ceee2185289f571c",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "outputs": [],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "def plot_cumulative_reward_comparison(file_name_dynaq, file_name_dynaqplus):\n",
    "\n",
    "    cum_reward_q = np.load(file_name_dynaq).item()['cum_reward_all'][2]\n",
    "    cum_reward_qPlus = np.load(file_name_dynaqplus).item()['cum_reward_all'][0]\n",
    "\n",
    "    plt.plot(np.mean(cum_reward_qPlus, axis=0), label='Dyna-Q+')\n",
    "    plt.plot(np.mean(cum_reward_q, axis=0), label='Dyna-Q')\n",
    "\n",
    "    plt.axvline(x=3000, linestyle='--', color='grey', alpha=0.4)\n",
    "    plt.xlabel('Timesteps')\n",
    "    plt.ylabel('Cumulative\\nreward', rotation=0, labelpad=60)\n",
    "    plt.legend(loc='upper left')\n",
    "    plt.title('Average performance of Dyna-Q and Dyna-Q+ agents in the Shortcut Maze\\n')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "plot_cumulative_reward_comparison('results/Dyna-Q_shortcut_steps.npy', 'results/Dyna-Q+.npy')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "21076543e2048b8680e6e0aef7fe3eb8",
     "grade": false,
     "grade_id": "cell-1754be7eabd4a8aa",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "What do you observe? (For reference, your graph should look like [Figure 8.5 in Chapter 8](http://www.incompleteideas.net/book/RLbook2018.pdf#page=189) of the RL textbook)\n",
    "\n",
    "The slope of the curve increases for the Dyna-Q+ curve shortly after the shortcut opens up after 3000 steps, which indicates that the rate of receiving the positive reward increases. This implies that the Dyna-Q+ agent finds the shorter path to the goal.\n",
    "\n",
    "To verify this, let us plot the state-visitations of the Dyna-Q+ agent before and after the shortcut opens up."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Do not modify this cell!\n",
    "\n",
    "plot_state_visitations(\"results/Dyna-Q+.npy\", ['Dyna-Q+ : State visitations before the env changes', 'Dyna-Q+ : State visitations after the env changes'], 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "449ce5338414248561fc1c8219cc3792",
     "grade": false,
     "grade_id": "cell-fafb7f5a25d136fb",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "What do you observe?\n",
    "\n",
    "Before the shortcut opens up, like Dyna-Q, the Dyna-Q+ agent finds the sole, long path to the goal. But because the Dyna-Q+ agent keeps exploring, it succeeds in discovering the shortcut once it opens up, which leads to the goal faster. So the bonus reward heuristic is effective in helping the agent explore and find changes in the environment without degrading the performance. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "29cd9402feeb69c6d64d8ae08c9aa201",
     "grade": false,
     "grade_id": "cell-89485f6ff67b4a48",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "## Wrapping Up\n",
    "\n",
    "Congratulations! You have:\n",
    "\n",
    "1. implemented Dyna-Q, a model-based approach to RL;\n",
    "2. implemented Dyna-Q+, a variant of Dyna-Q with an exploration bonus that encourages exploration; \n",
    "3. conducted scientific experiments to empirically validate the exploration/exploitation dilemma in the planning context on an environment that changes with time."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "checksum": "bdccc04273c6aadc27991c28fb2065e9",
     "grade": false,
     "grade_id": "cell-5ff77de3e5722637",
     "locked": true,
     "schema_version": 1,
     "solution": false
    }
   },
   "source": [
    "Some points to ponder about:\n",
    "1. At what cost does Dyna-Q+ improve over Dyna-Q?\n",
    "2. In general, what is the trade-off of using model-based methods like Dyna-Q over model-free methods like Q-learning?\n",
    "\n",
    "\n",
    "---\n",
    "\n",
    "**Note**: Apart from using the 'Submit' button in the notebook, you have to submit an additional `zip` file containing the 'npy' files that were generated from running the experiment cells. To do so:\n",
    "\n",
    "1. Generate the zip file by running the experiment cells in the notebook. On the top of the notebook, navigate to 'File->Open' to open the directory view of this assignment. Select \"results.zip\" and click on \"Download\". Alternatively, you can download just the results folder and run \"zip -jr results.zip results/\" (_The flag 'j' is required by the grader!_).\n",
    "2. Go to the \"My submission\" tab and click on \"+ Create submission\".\n",
    "3. Click on \"C2M4 Data-file Grader\" and upload your `results.zip`.\n",
    "\n",
    "**This accounts for 50% of the marks, so don't forget to do so!**"
   ]
  }
 ],
 "metadata": {
  "coursera": {
   "course_slug": "sample-based-learning-methods",
   "graded_item_id": "trR7Z",
   "launcher_item_id": "edrCE"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
